Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将方法作为回调传递_Javascript_Oop_Callback - Fatal编程技术网

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));