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

时间:2015-06-28 20:31:50

标签: javascript global-variables

我曾经认为,当您在全局命名空间中声明变量时,在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

有人可以对此有所了解吗?

1 个答案:

答案 0 :(得分:3)

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

看起来有点武断,但实际上它是有道理的:毕竟,你不能在运行时删除var语句,语义是var在当前执行时创建一个属性context的变量环境的绑定对象。 (哇,这是一口。)所以它有意义,它创造了一个不可删除的属性。

详细信息位于规范的§10.5§10.2.1.1.2中。 §10.5基本上说var触发CreateMutableBinding(§10.2.1.1.2),D参数为false(false = not deletable)。