JavaScript:初始化对象后初始化内部变量

时间:2013-04-12 20:23:22

标签: javascript object scope closures delayed-execution

更新:重写问题,因为原始问题有错误的假设(我在控制台中运行代码已经初始化了我认为未定义的变量)。

这是有道理的:

var obj = { 'whichScope': a };
obj.whichScope; //"ReferenceError: a is not defined"

但是接下来的例子怎么会抛出错误呢?如果第二行在第一行之前运行,为什么不将obj.whichScope解析为“After”?

var obj = { 'whichScope': a };
var a = "After";
obj.whichScope; //"undefined"

如果前一个例子中的“var a”在obj初始化之前运行,那么“a =”之后的任何部分是否为“;”也在obj初始化之前运行?

var a = "Before";
var obj = { 'whichScope': a };
a = "After";
obj.whichScope; //"Before"

如果whichScope引用了一个返回'a'的函数,那么它确实在最后一个例子中解析为“After”。

1 个答案:

答案 0 :(得分:1)

这称为变量吊装。

参考文献:

变量(用var声明)和函数被提升到其范围的顶部。

从技术上讲,你的脚本是这样的:

var a;  // = undefined
var obj = { 'whichScope': a };
a = "After";

虽然你的第一个例子不是你说的。正如预期的那样,obj.whichScope的值为undefined

DEMO: http://jsfiddle.net/pRQwK/

至于你的上一个语句If whichScope refers to a function that returns 'a' then it does resolve to "After" in the second example. - 这是因为没有捕获a的值(通过闭包)。设置属性时,会立即捕获其值(与闭包无关)。