更新:重写问题,因为原始问题有错误的假设(我在控制台中运行代码已经初始化了我认为未定义的变量)。
这是有道理的:
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”。
答案 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
的值(通过闭包)。设置属性时,会立即捕获其值(与闭包无关)。