JavaScript:初始化对象后初始化内部变量
更新:重写问题,因为原始问题有错误的假设(我在控制台中运行的代码已经初始化了我认为未定义的变量) 这是有道理的:JavaScript:初始化对象后初始化内部变量,javascript,object,scope,closures,delayed-execution,Javascript,Object,Scope,Closures,Delayed Execution,更新:重写问题,因为原始问题有错误的假设(我在控制台中运行的代码已经初始化了我认为未定义的变量) 这是有道理的: var obj = { 'whichScope': a }; obj.whichScope; //"ReferenceError: a is not defined" 但是下一个例子怎么没有抛出错误呢?如果第二行在第一行之前运行,为什么obj.whichScope不能解析为“之后” 如果上一个示例中的“var a”在obj初始化之前运行,“a=”之后的任何部分是否在初始化obj之前
var obj = { 'whichScope': a };
obj.whichScope; //"ReferenceError: a is not defined"
但是下一个例子怎么没有抛出错误呢?如果第二行在第一行之前运行,为什么obj.whichScope不能解析为“之后”
如果上一个示例中的“var a”在obj初始化之前运行,“a=”之后的任何部分是否在初始化obj之前也运行
var a = "Before";
var obj = { 'whichScope': a };
a = "After";
obj.whichScope; //"Before"
如果whichScope引用了一个返回“a”的函数,那么在上一个示例中,它确实会解析为“After”。这就是变量 参考资料:
var
声明)和函数被提升到其作用域的顶部
从技术上讲,你的剧本是这样的:
var a; // = undefined
var obj = { 'whichScope': a };
a = "After";
虽然你的第一个例子没有做到你所说的。obj.whichScope
的值是未定义的
,正如预期的那样
演示:
对于上一条语句,如果whichScope引用了一个返回“a”的函数,那么在第二个示例中它会解析为“After”。
-这是因为a
的值没有被捕获(通过闭包)。设置属性时,会立即捕获其值(与闭包无关)
var a; // = undefined
var obj = { 'whichScope': a };
a = "After";