Javascript命名空间初始化模式需要`var`或`window

时间:2014-04-16 08:57:14

标签: javascript namespaces

我遇到了这种用于JavaScript初始化的模式:

foo = foo || {};
alert('no errors!');

但它似乎不起作用,除非之前定义了foo

同一模式有两种变体似乎可以正常工作:

var foo = foo || {};
alert('no errors!');

foo = window.foo || {};
alert('no errors!');

从我的观点来看,我不明白为什么第一个不起作用,而另外两个不起作用。

为什么?你能详细解释一下吗?

2 个答案:

答案 0 :(得分:2)

Javascript有global object。在浏览器中,它由名称window引用。

window.foo在全局对象中创建一个属性。

var foo创建一个全局变量。这与全局对象的属性非常相似,但您不能在其上使用delete

简单地声明foo而不使用var关键字也会在全局对象上创建属性。它是一种语言设计选择 - 一种糟糕的选择 - 但却是一种设计选择。

当你在全球范围内时,

var foowindow.foo都同样有效。如果你在函数内部 - 也许是一个模块 - 你必须使用window.foo来确保你到达全局对象。

答案 1 :(得分:1)

您无法读取未定义的变量(that's a reference error)。这就是

的原因
something = foo;
如果未声明foo变量,

将导致错误。当然声明window,查询其属性 foo没有问题。