我遇到了这种用于JavaScript初始化的模式:
foo = foo || {};
alert('no errors!');
但它似乎不起作用,除非之前定义了foo
。
同一模式有两种变体似乎可以正常工作:
var foo = foo || {};
alert('no errors!');
和
foo = window.foo || {};
alert('no errors!');
从我的观点来看,我不明白为什么第一个不起作用,而另外两个不起作用。
为什么?你能详细解释一下吗?
答案 0 :(得分:2)
Javascript有global object
。在浏览器中,它由名称window
引用。
window.foo
在全局对象中创建一个属性。
var foo
创建一个全局变量。这与全局对象的属性非常相似,但您不能在其上使用delete
。
简单地声明foo
而不使用var
关键字也会在全局对象上创建属性。它是一种语言设计选择 - 一种糟糕的选择 - 但却是一种设计选择。
var foo
和window.foo
都同样有效。如果你在函数内部 - 也许是一个模块 - 你必须使用window.foo
来确保你到达全局对象。
答案 1 :(得分:1)
您无法读取未定义的变量(that's a reference error)。这就是
的原因something = foo;
如果未声明foo
变量,将导致错误。当然声明window
,查询其属性 foo
没有问题。