Javascript 将方法作为回调传递
我试图将一个方法作为回调引用传递给另一个类的方法:Javascript 将方法作为回调传递,javascript,oop,callback,Javascript,Oop,Callback,我试图将一个方法作为回调引用传递给另一个类的方法: function A() { this.callback = function(){return 0;}; } A.prototype.set = function(cb) { this.callback = cb; }; A.prototype.test = function(){ console.log("test " + this.callback()); }; function B(o) { thi
function A() {
this.callback = function(){return 0;};
}
A.prototype.set = function(cb) {
this.callback = cb;
};
A.prototype.test = function(){
console.log("test " + this.callback());
};
function B(o) {
this.prop = "blah B";
o.set(this.blah);
}
B.prototype.blah = function() {
console.log(this);
return this.prop;
};
我对死刑的期望是什么
a = new A();
b = new B(a);
a.test();
结果如何
>B { prop="blah B", blah=function()}
>test blah B
但是控制台显示
>A { cb=function(), set=function(), test=function()}
>test undefined
好像方法blah
已分配给A
执行
为什么我会得到这个结果?我怎样才能得到我期望的结果呢?是的,这就是JavaScript的
this
关键字的工作原理-它指的是当前的执行上下文,在本例中它被调用的对象。您正在调用它,就好像它是a
的方法一样。您需要在B
实例中将其作为方法调用。如果您不需要支持IE8或更低版本,可以在函数中使用绑定this
,使其始终指向B
实例。否则,A
实例需要引用调用方法的B
实例
您可以使用var self=this手动绑定该方法代码>黑客。您也可以在B
构造函数中执行此操作:
function B(o) {
var self = this;
this.prop = "blah B";
o.set(function() { self.blah(); });
}
但是,如果您能详细介绍一下您正试图做的事情,可能会有一个更优雅的解决方案。问题在于执行上下文-JavaScript中函数的是如何绑定的。调用最后一行a.test()
时,回调
在对象a
的上下文中查找名为prop
的属性。在您的例子中,对象a
没有prop
属性,因此未定义。当您向a
提供prop
时,它工作正常。最后拨弄控制台.log
。这里调用回调两次,一次不赋值prop
,第二次赋值相同:
function B(o) {
this.prop = "blah B";
o.set(this.blah);
o.prop = this.prop;
}
“好像这个方法布拉赫已经被分配给了一个来执行”,你几乎得到了它,只需在你的句子中用“A”替换“A”。实际上,默认情况下,此
引用拥有该方法的实例
碰巧,o.set(this.blah)
可以翻译成a.callback=b.blah
,这意味着a.callback
和b.blah
现在引用相同的函数。换句话说,相同的函数现在由两个实例a
和b
拥有:
a.callback() // "return (this -> a).prop" -> undefined
b.blah() // "return (this -> b).prop" -> "blah B"
粗略地说,您需要一种方法来将此
重定向到b
内部回调
您可以使用:
或():
当在test
方法中调用blah
方法时,此
指向一个A
实例。由于A
没有prop
属性,因此它返回未定义的属性
您需要更改行o.set(this.blah)代码>到这个o.set(this.blah.bind(this))代码>
现在,blah
总是绑定到B
的一个实例,当调用test
时,这个。prop
将返回“blah B”
,这是预期的结果。闭包方法不起作用,它需要是function(){return me.blah();}
(正如blah
返回一个值)。我不知道绑定,这是一个有趣的。。对于IE的兼容性来说,这并不重要,我的其他代码与@ThierryJ不兼容。谢谢你的回复,我已经相应地修改了答案。
var me = this;
o.set(function () {
// this -> a
// me -> b
return me.blah();
});
o.set(this.blah.bind(this));