Javascript回调和";这";
我有下面的Javascript代码,我正试图获得一个回调,如下所示。我想看到一个带有“123”的警报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
我知道发生了什么,但我不知道如何解决它。如何获取引用对象的回调函数?在我的例子中,我可以对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,但是我的陈述没有说明我在哪里观察到了它。