Javascript回调和";这";

Javascript回调和";这";,javascript,callback,Javascript,Callback,我有下面的Javascript代码,我正试图获得一个回调,如下所示。我想看到一个带有“123”的警报 我知道发生了什么,但我不知道如何解决它。如何获取引用对象的回调函数?在我的例子中,我可以对A进行更改,但不能对B进行更改。因此,您需要将上下文传递给doCallBack 例如 那么你会做: b.doCallBack(a.callback, a); 如果无法修改B,则可以在A内使用闭包: var A = function (arg) { var self = this; this

我有下面的Javascript代码,我正试图获得一个回调,如下所示。我想看到一个带有“123”的警报


我知道发生了什么,但我不知道如何解决它。如何获取引用对象的回调函数?在我的例子中,我可以对A进行更改,但不能对B进行更改。

因此,您需要将上下文传递给
doCallBack

例如

那么你会做:

b.doCallBack(a.callback, a);
如果无法修改B,则可以在A内使用闭包:

var A = function (arg) {
    var self = this;
    this.storedArg = arg;
    this.callback = function () { alert(self.storedArg); }
}

因此,您需要将上下文传递给
doCallBack

例如

那么你会做:

b.doCallBack(a.callback, a);
如果无法修改B,则可以在A内使用闭包:

var A = function (arg) {
    var self = this;
    this.storedArg = arg;
    this.callback = function () { alert(self.storedArg); }
}

通过将变量放入变量
that

var A = function(arg){
    this.storedArg = arg;
    var that = this; // Add this!
    this.callback = function(){ alert(that.storedArg); }
}

此处的工作演示:

您可以创建一个变量,通过将其放入变量
that

var A = function(arg){
    this.storedArg = arg;
    var that = this; // Add this!
    this.callback = function(){ alert(that.storedArg); }
}
在此进行工作演示:

我了解发生了什么(在第二次回调期间,“这”是b而不是a)

不,JS不是基于类的语言,在那里可能会发生一些事情。如果
function(){alert(this.storedArg);
被称为
callback();
(如
b.doCallback
),则指向全局对象(
窗口

为了避免这种情况,您必须将
A
更改为

var A = function(arg){
    var that = this; // store reference to the current A object
    this.storedArg = arg;
    this.callback = function(){
        alert(that.storedArg); // and use that reference now instead of "this"
    };
}
如果您不希望
storedArg
属性发生更改,您甚至可以将其变得更简单:

var A = function(arg){
    this.storedArg = arg;
    this.callback = function(){
        alert(arg); // just use the argument of the A function,
                    // which is still in the variable scope
    };
}
我了解发生了什么(在第二次回调期间,“这”是b而不是a)

不,JS不是基于类的语言,在这里可能会发生一些事情。如果
function(){alert(this.storedArg);
被称为
callback();
(如
b.doCallback
),则指向全局对象(
窗口

为了避免这种情况,您必须将
A
更改为

var A = function(arg){
    var that = this; // store reference to the current A object
    this.storedArg = arg;
    this.callback = function(){
        alert(that.storedArg); // and use that reference now instead of "this"
    };
}
如果您不希望
storedArg
属性发生更改,您甚至可以将其变得更简单:

var A = function(arg){
    this.storedArg = arg;
    this.callback = function(){
        alert(arg); // just use the argument of the A function,
                    // which is still in the variable scope
    };
}
执行此操作时:

b.doCallback(a.callback);
它只调用a的
回调
函数,而不告诉它将
a
用于
;因此全局对象用于

一种解决方案是将回调打包:

b.doCallback(function() { a.callback(); });
其他解决方案包括回调到
a
,使用(这只是执行我的第一个解决方案的一种奇特方式),或者将
a
传递到
doCallback
并调用
a
上的
callback
,使用。

执行此操作时:

b.doCallback(a.callback);
它只调用a的
回调
函数,而不告诉它将
a
用于
;因此全局对象用于

一种解决方案是将回调打包:

b.doCallback(function() { a.callback(); });

其他解决方案包括回调到
a
,使用(这只是我第一个解决方案的一种奇特方式),或者将
a
传递到
doCallback
并调用
a
上的
callback

您需要传递希望回调在其中执行的上下文:

var B = function() {
    this.doCallback = function(callback, context) {
        callback.apply(context); 
    };
};

b.doCallback(a.callback, a); // 123

您需要传递要在其中执行回调的上下文:

var B = function() {
    this.doCallback = function(callback, context) {
        callback.apply(context); 
    };
};

b.doCallback(a.callback, a); // 123

因为在
A.callback
函数中,
这个
不是指
A
,而是指
窗口
对象

var A = function(arg){
    this.storedArg = arg;
    this.callback = function(){ alert(this.storedArg); }
    -----------------------------------^-----------------
}
你可以试试这个

var A = function(arg){
    this.storedArg = arg;
    var that = this;
    this.callback = function(){ alert(that.storedArg); }
}

var B = function() {
    this.doCallback = function(callback){ callback(); }
}       

var pubCallback = function(){ alert('Public callback') };

var a = new A(123);
var b = new B();

b.doCallback(pubCallback); // works as expected
b.doCallback(a.callback);  // alerts 123

因为在
A.callback
函数中,
这个
不是指
A
而是指
窗口
对象

var A = function(arg){
    this.storedArg = arg;
    this.callback = function(){ alert(this.storedArg); }
    -----------------------------------^-----------------
}
你可以试试这个

var A = function(arg){
    this.storedArg = arg;
    var that = this;
    this.callback = function(){ alert(that.storedArg); }
}

var B = function() {
    this.doCallback = function(callback){ callback(); }
}       

var pubCallback = function(){ alert('Public callback') };

var a = new A(123);
var b = new B();

b.doCallback(pubCallback); // works as expected
b.doCallback(a.callback);  // alerts 123

你试过发出警报吗?@Jack,我不认为最终目标显示警报。你试过发出警报吗?@Jack,我不认为最终目标显示警报。
未提及
A.callback
(顺便说一句,该回调不存在),它也不应引用
A
不引用
A.callback
(顺便说一句,该回调不存在),它也不应该引用
A
。这需要修改B类,对吗?很遗憾,我不能这样做。@Watusimoto我为您不能修改B时添加了第二个版本。这需要修改B类,对吗?很遗憾,我不能这样做。@Watusimoto我为您不能修改B时添加了第二个版本是的,你是对的;我做了一些日志记录,显示这个==b,但是我的陈述没有说明我在哪里观察到了它。是的,你是对的;我做了一些日志记录,显示了这个==b,但是我的陈述没有说明我在哪里观察到了它。