0

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

这是有道理的:

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 = “After”;' 的任何部分是否 在 obj 初始化之前也运行?

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

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

4

1 回答 1

1

这就是所谓的变量提升。

参考:

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

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

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

虽然你的第一个例子没有按照你说的做。正如预期的那样,obj.whichScope值为。undefined

演示:http: //jsfiddle.net/pRQwK/

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

于 2013-04-12T20:25:05.877 回答