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

Javascript变量在匿名回调中具有不同的值,javascript,callback,scope,closures,Javascript,Callback,Scope,Closures,我遇到了这个bug,没有找到任何例子。此处记录以供参考 问题是在下面的示例中调用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();

我遇到了这个bug,没有找到任何例子。此处记录以供参考

问题是在下面的示例中调用
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:

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


JavaScript中的对象属性必须始终明确引用。也就是说,与C++、java等语言不同,JavaScript不提供对“成员变量”的隐式引用。如果要在这些对象上设置属性“x”,则必须将其称为
this.x

这是通过使用
var
定义x来修复的

var x = 'o.f() local'

o.f
p.f
中的
x
都在全局范围内,因为它从来没有用
var

声明过,这会改变事情,但现在回调函数将无法访问这两个变量。这不是真的,这会混淆范围和上下文。使用var使局部范围内的x在全局上下文(窗口)中引用x。使用this.x在任何对象“this”的上下文中引用x。这是不正确的。函数中的
var
声明会创建该函数的局部变量。对不起,我的意思是不使用var会使局部范围内的x在全局上下文中引用x。使用VARx创建该函数的局部变量(没有上下文)是正确的。这将在本例中给出所需的输出。这与我的初衷略有不同。这个.x总是引用o.x,而每次调用o.f()时,var x将是一个不同的变量。