2016-05-31 41 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