【问题标题】:JavaScript: Initializing inner variable after initializing objectJavaScript:初始化对象后初始化内部变量
【发布时间】:2013-04-05 12:07:07
【问题描述】:

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

这是有道理的:

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”。

【问题讨论】:

    标签: javascript object scope closures delayed-execution


    【解决方案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-07-04
      • 1970-01-01
      • 2019-08-28
      • 2013-05-15
      • 2013-06-27
      • 2012-04-20
      • 2019-07-23
      • 2019-05-17
      • 2021-07-08
      相关资源
      最近更新 更多