const vs var 和 window.name 属性

Mar*_*cus 3 javascript ecmascript-6

刚刚在最近看到的一个问题中遇到了以下问题,我很好奇为什么var nameconst 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>');
}
Run Code Online (Sandbox Code Playgroud)

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

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

Bak*_*kot 7

因为const和 一样let,是词法作用域,顶级词法作用域与全局作用域不同。这是一个类比:

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
}
Run Code Online (Sandbox Code Playgroud)

const不是劫持 window.name;它只是遮蔽它。您可以通过观察window.name保持不变的第二种情况来看到这一点。您可以将顶级代码视为在上面函数的嵌套块中:var声明放在全局范围内,但letconst声明没有。