const vs var 和 window.name 属性[重复]

Posted

技术标签:

【中文标题】const vs var 和 window.name 属性[重复]【英文标题】:const vs var and the window.name property [duplicate] 【发布时间】:2016-09-30 00:23:25 【问题描述】:

刚刚在最近的question I was looking at 中遇到了以下内容,我很好奇为什么var nameconst name 提供不同的输出。运行下面的 sn-ps 看看我的意思。

如果它与 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)?还是我只是看错了?

【问题讨论】:

【参考方案1】:

因为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 声明却没有。

【讨论】:

还应注意let 的行为类似于const,原因相同。 明白了。我知道let,但不知道const 遵循相同的约束。每天学习新东西。

以上是关于const vs var 和 window.name 属性[重复]的主要内容,如果未能解决你的问题,请参考以下文章

var,let和const的区别是什么?

var和let/const的区别

var、function、let、const变量提升

JavaScript中声明变量var和let/const的区别讲解

let,const 与 var的区别

如何用“let”和“const”替换此代码中的“var”关键字?