全局var混淆:var a vs window.a

Global var confusion: var a vs window.a

本文关键字:var vs window 混淆 全局      更新时间:2023-09-26

我曾经认为,当您在全局命名空间中声明变量时,在web浏览器的上下文中,它会附加到窗口对象。这似乎确实发生了,但用var关键字声明全局变量和将其直接附加到窗口对象之间一定有区别。从Chrome控制台查看:

var a;
> undefined
window.hasOwnProperty("a")
> true
window.a = 0
> 0
delete window.a
> false
window.hasOwnProperty("a")
> true
/* so it's still there */
window.a
> 0
window.b = undefined
> undefined
window.hasOwnProperty("b")
> true
window.b = 0
> 0
delete window.b
> true
window.hasOwnProperty("b")
> false
window.b
> undefined

有人能解释一下吗?

您已经确定了唯一的显著区别:如果使用var,则不能使用在全局对象上创建的属性delete。如果你不这样做,如果你只是分配给一个属性来创建它,那么就像所有对象属性一样,你可以删除它

这看起来有点武断,但实际上是有道理的:毕竟,您不能在运行时删除var语句,其语义是var在当前执行上下文的变量环境的绑定对象上创建一个属性(哇,这太令人讨厌了。)因此,它创建了一个不可删除的属性是有道理的。

详细信息见本规范的§10.5和§10.2.1.1.2。§10.5基本上说var触发CreateMutableBinding(§10.2.1.1.2),其中D参数为false(false=不可删除)。