实例化对象时出现“未定义”错误

时间:2014-08-05 17:51:16

标签: javascript

如果我创建这样的对象:

var foo = foo || {};

没问题。

但是这个:

var foo = bar || {};

产生错误:

Uncaught ReferenceError: bar is not defined 

为什么第一个片段在第一个片段时没有工作?

3 个答案:

答案 0 :(得分:4)

未定义和未声明之间存在差异。

只要您在左侧使用var foofoo就会宣布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命名空间会尝试查找内置函数或其他非变量定义。