javascript - const vs var 和 window.name 属性

标签 javascript ecmascript-6

<分区>

刚刚在最近的 question I was looking at 中遇到以下内容,我很好奇为什么 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>');
}

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)?还是我只是以错误的方式看待它?

最佳答案

因为 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 保持不变来看到这一点。您可以将顶层代码视为在上述函数的嵌套 block 中:var 声明放在全局范围内,但 letconst 声明没有。

关于javascript - const vs var 和 window.name 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37555019/

相关文章:

javascript - 在实际网页上显示 chrome 控制台内容

javascript - 使用 angularJs 将文本渲染为 html

javascript - Object.assign 和 ... spread 运算符失败无提示,不添加元素

typescript : Object Equality Comparison (Object Equals Object)

javascript - Promise.all 不返回

node.js - 将 babel 与 Node 集群结合使用

javascript - 使用Flask return修改网页

javascript - 如何获取javascript文件中rails图像的位置

javascript - 如何使用 javascript 从 tizen 手机获取 IMEI 号码

ecmascript-6 - es6 导入 'destructuring' 不工作