如果我创建这样的对象:
var foo = foo || {};
没问题。
但是这个:
var foo = bar || {};
产生错误:
Uncaught ReferenceError: bar is not defined
为什么第一个片段在第一个片段时没有工作?
答案 0 :(得分:4)
未定义和未声明之间存在差异。
只要您在左侧使用var foo
,foo
就会宣布为undefined
。在后一个示例中,bar
未声明,并且无法通过右侧的表达式访问。
以下是一些非常好的例子:
var foo = (foo===undefined); // foo is now `true`!
var x = x++; // x is now `NaN` (the result of `undefined`+1)
var z = v, v = 1; // z is actually `undefined` here since the "lefts"
// are all declared before the "rights".
注意:您不能使用不使用var
的全局变量(例如:x=x++
)。
这里有fun blog post关于未声明的 vs undefined 。并且,对于更多刺激,here's an SO post解释了如何测试变量是否被声明。
答案 1 :(得分:1)
虽然我无法具体回答为什么第二部分不起作用,但我可以尝试回答为什么第一部分无效。通过变量提升,JavaScript解释器将第一个改为看起来像这样
var foo;
foo = foo || {};
所以它有效,第二个没有,因为当它运行第二行时,foo被声明为未定义。
答案 2 :(得分:1)
这里的问题是变量的声明。如果您考虑如何评估var
将在评估其他任何内容之前为foo声明。 bar
实际上指的是命名空间完全没有意识到的东西。
声明var foo
后,无论实际值如何,命名空间都会知道变量。通过这种方式,没有var
命名空间会尝试查找内置函数或其他非变量定义。