【问题标题】:Javascript variable has different value in anonymous callbackJavascript变量在匿名回调中具有不同的值
【发布时间】:2014-04-13 20:20:08
【问题描述】:

我遇到了这个错误,但在任何地方都没有找到示例。在此记录以供参考。

问题在于,在下面的示例中调用o.callback() 时,x 的值在定义和执行回调之间发生了变化。

p = {
    f: function () { x = 'p.f() local'; }
};
o = {
    f: function () {
        x = 'o.f() local';
        this.callback = function () { console.log(x); };
    }
};
o.f();
p.f();
o.callback.apply();

这里的输出是:

p.f() local

正如我所料:

o.f() local

更新 这是一个 jsfiddle:http://jsfiddle.net/elplatt/kzS5A/1/

【问题讨论】:

    标签: javascript callback scope closures


    【解决方案1】:

    变量“x”是全局,因为它没有用var 显式声明。因此,所有这些函数都引用相同的“x”。

    JavaScript 中的对象属性必须始终显式引用。也就是说,与 C++ 或 Java 等语言不同,JavaScript 不提供对“成员变量”的隐式引用。如果您想要这些对象的属性“x”,则必须将其称为 this.x

    【讨论】:

    • 这将在此示例中提供所需的输出。这与我的意图略有不同。 this.x 将始终引用 o.x 而 var x 将是每次调用 o.f() 时的不同变量。
    【解决方案2】:

    这已通过使用var 定义 x 来解决

    var x = 'o.f() local'
    

    o.fp.f 中的 x 都在全局范围内,因为它从未使用 var 声明。

    【讨论】:

    • 这会改变事情,但现在回调函数将无法访问这些变量中的两个
    • 不正确,这会将范围与上下文混淆。使用 var 使局部范围内的 x 在全局上下文(窗口)中引用 x。使用 this.x 是指在任何对象“this”的上下文中的 x。
    • 这是不正确的。函数内的var 声明会创建该函数的本地变量。
    • 对不起,我的意思是说 not 使用 var 使本地范围内的 x 在全局上下文中引用 x。您是正确的,使用 var x 创建了该函数的局部变量(没有上下文)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 2016-03-27
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多