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 name
和const name
提供不同的输出。运行下面的 sn-ps 看看我的意思。
如果它与 name
作为 window
对象属性有关,那么 重新声明/定义 name
和 const
应该会导致我认为的错误。但是,在下面的示例中,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
声明被置于全局范围内,但 let
和 const
声明却没有。
【讨论】:
还应注意let
的行为类似于const
,原因相同。
明白了。我知道let
,但不知道const
遵循相同的约束。每天学习新东西。以上是关于const vs var 和 window.name 属性[重复]的主要内容,如果未能解决你的问题,请参考以下文章