最近在question I was looking at发现了以下内容,我很好奇为什么var name
和const name
会提供不同的输出。运行下面的片段,看看我的意思。
如果它与name
作为window
对象属性有关,则重新声明/定义 name
const
应该我会想到会导致错误。但是,在下面的示例中,const
允许将name
重新声明为数组,而var
则不允许。{/ p>
var name = ['one', 'two', 'three', 'four', 'five'];
for (var i=0; i < name.length; i++){
document.write(name[i] + '<br>');
}
&#13;
const name = ['one', 'two', 'three', 'four', 'five'];
for (var i=0; i < name.length; i++){
document.write(name[i] + '<br>');
}
&#13;
那么,为什么const
允许我劫持 window.name
属性并将其重新分配为数组?但是var
不允许重新分配(仍然是默认string
)?或者我只是以错误的方式看待它?
答案 0 :(得分: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
声明放在全局范围内,但let
和const
声明不会。 / p>