callback参数不被传递(Node.js)

在下面的代码中,我试图将参数“test”传递给callback函数。 好消息是callback确实被称为; 然而,string“我看到未定义”正在打印,而不是“我看testing”。

var MyObject = function(){ } MyObject.prototype.b = function(data){ console.log("I see " + data); } a = function(callback){ callback("test"); } var it = new MyObject(); a(function(){it.b()}); 

我有一个预感,它与封闭有关,因为我看到string“我看到testing”打印,如果我直接调用它。(“testing”)。 为什么这个函数没有正确接收这个参数呢?

你在调用没有参数的it.b() ,所以当你进入b()方法时,没有参数应该是不足为奇的。 如果你想要一个参数出现it.b() ,你必须在你的callback中声明它,然后你可以把它传递给it.b(arg)

 a(function(arg){ it.b(arg) }); 

或者,您可以传递callback中的所有参数:

 a(function(){ it.b.apply(it, arguments) }); 

或者,你可以使用.bind()

 a(it.b.bind(it)); 

看来你正在创build一个新的匿名函数,你正在作为callback传递给一个。 如果您将最后一行更改为:

 a(it.b); 

一切都应该如你所期待的那样工作。

让我们分析一下你的代码的最后一行:

 a(function(){it.b()}); //I will name the above function 'xyz' for convenience a(function xyz(){it.b()}); 

在上面的行中,你将一个函数xyz作为一个parameter passing给()。 你传递的函数直接调用it.b()而不传递任何参数。

所以在这里发生的是,当你将xyz传递给()时,xyz被称为string“test”作为参数,即xyz(“test”)被调用。 但是这个string“testing”没有任何用处,因为你直接调用它.b()而不传递任何数据,因此你得到“未定义”。

为了得到你想要的输出,你需要用以下两种方法中的任何一种来编写代码。

方法1:

 var MyObject = function(){ } MyObject.prototype.b = function(data){ console.log("I see " + data); } a = function(callback){ callback("test"); } var it = new MyObject(); a(it.b); 

方法2:

 var MyObject = function(){ } MyObject.prototype.b = function(data){ console.log("I see " + data); } a = function(callback){ callback("test"); } var it = new MyObject(); a(function(data){it.b(data)});