const vs var和window.name属性

时间:2016-05-31 20:24:57

标签: javascript ecmascript-6

最近在question I was looking at发现了以下内容,我很好奇为什么var nameconst 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;
&#13;
&#13;

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

那么,为什么const允许我劫持 window.name属性并将其重新分配为数组?但是var不允许重新分配(仍然是默认string)?或者我只是以错误的方式看待它?

1 个答案:

答案 0 :(得分:4)

因为constlet一样,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声明不会。 / p>