全局变量和全局对象的属性之间是否存在任何差异

Int*_*ist 9 javascript global-variables

我正在阅读David Mark关于js框架"Sencha"的以下分析:https://gist.github.com/3279190并且在那里他声明......

他们想要的是一个全局变量,但他们最终得到的是全局对象的属性.根据规范和(以及实施历史),两者之间存在足够的差异,需要注意不要混淆它们(如此处所做).

...但据我所知,var my_global = 123;和(在浏览器环境中)之间没有任何区别window.my_global = 123;(在这个例子中我假设环境是一个浏览器 - 因此使用window,但我本来可以使用,但this.my_global显然在不同环境中运行时,全局对象会有所不同.

但忽略这种微小的差异是否将属性分配给全局对象和创建全局变量之间存在差异?我没想过,创建全局变量只是将属性分配给全局对象的另一种方法.

我相信在某些浏览器中如果有一个id为"my_global"的元素可能会出现问题,那么显然可能会导致JavaScript引用正确的问题,但我不确定如何/导致该问题的原因(例如,将属性分配给全局对象导致元素id问题发生,或者是否声明导致元素id问题的全局变量?)

有人可以为我澄清一下吗?

Tim*_*own 10

var在全局范围中使用创建的变量确实会创建全局对象的属性.但是,此属性与尚未使用的全局对象的属性具有不同的行为var.

首先,执行变量声明的方式有所不同:var全局范围中的语句在执行任何代码之前创建全局对象的属性,这种效应通常称为提升,在Web上有详细记录(请参阅下面的参考资料) .

其次,全局变量与未创建的全局对象的属性不同var,不能使用delete运算符删除(尽管在旧版本的IE中不是这样).delete不能用于删除变量.这种差异取决于每个对象属性具有的内部属性属性.这些属性在ECMAScript规范中指定.在ECMAScript 5术语中,var foo = "bar"使用属性创建foo全局对象的[[Configurable]]属性,falsethis.foo = "bar"(在全局范围内)创建具有foo属性的[[Configurable]]属性true.

参考文献: