回调的参数没有被传递(Node.js)

时间:2014-01-24 06:17:00

标签: node.js

在下面的代码中,我试图将参数“test”传递给回调。好消息是回调确实被调用了;但是,正在打印字符串“I see undefined”而不是“I see test”。

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

我有预感它与闭包有关,因为如果直接调用it.b(“test”),我会看到字符串“I see test”。为什么函数不能正确接收参数?

3 个答案:

答案 0 :(得分:4)

你在没有参数的情况下调用it.b(),所以当你进入b()方法时没有参数就不足为奇了。如果您希望为it.b()显示参数,则必须在回调中声明它,以便将其传递给it.b(arg)

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

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

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

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

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

答案 1 :(得分:2)

您似乎正在创建一个新的匿名函数,您将其作为回调函数传递给。如果您将最后一行更改为:

a(it.b);

一切都应该像你期待的那样发挥作用。

答案 2 :(得分:2)

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

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

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

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

所以这里发生的是当你将xyz传递给a()时,用字符串“test”作为参数调用xyz,即调用xyz(“test”)。但是这个字符串“test”没有任何用处,因为你直接调用it.b()而没有传递任何数据,因此你得到'undefined'。

要获得所需的输出,您需要通过以下两种方法之一编写代码。

方法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)});