2016-05-31 71 views
2

剛剛在最近的question I was looking at中遇到以下內容,我很好奇爲什麼var nameconst name提供不同的輸出。運行下面的代碼片段以查看我的意思。const vs var和window.name屬性

如果有什麼關係name是一個window對象的屬性,然後重新申報/定義nameconst應導致一個錯誤,我覺得。但是,在下面的示例中,const允許將name重新聲明爲數組,而var不允許。

var name = ['one', 'two', 'three', 'four', 'five']; 
 
for (var i=0; i < name.length; i++){ 
 
    document.write(name[i] + '<br>'); 
 
}

const name = ['one', 'two', 'three', 'four', 'five']; 
 
for (var i=0; i < name.length; i++){ 
 
    document.write(name[i] + '<br>'); 
 
}

那麼,爲什麼const讓我劫持window.name財產並重新分配它作爲一個數組?但var不允許重新分配(仍然爲默認string)?或者我只是以錯誤的方式看待它?

回答

4

因爲const,就像let,是lexically scoped,頂級詞法作用域與全局作用域不一樣。這裏有一個比喻:

function f(){ 
    var name = 1; 
    { 
    var name = 2; // does not create a new variable, because name already exists at the top level of the function 
    } 
    console.log(name); // 2 
} 

function g(){ 
    var name = 1; 
    { 
    const name = 2; // creates a new variable 
    } 
    console.log(name); // 1 
} 

const劫持window.name;它只是遮蔽它。你可以通過觀察你的第二個案例來看到window.name保持不變。您可以將頂層代碼視爲位於上述函數的嵌套塊中:var聲明置於全局範圍內,但letconst聲明不會。

+1

也應該注意,出於同樣的原因,'let'就像'const'一樣。 – Barmar

+0

Gotcha。我知道'let',但不知道'const'遵循相同的約束。每天學些新東西。 – Marcus