在下面的代码中,我试图将参数“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”。为什么函数不能正确接收参数?
答案 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)});