Javascript变量在匿名回调中具有不同的值

时间:2014-03-10 15:59:01

标签: javascript callback scope closures

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

问题在于,在下面的示例中调用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/

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

通过使用var定义x

来解决此问题
var x = 'o.f() local'

xo.f中的p.f位于全局范围内,因为它从未使用var声明。