var a = function(){
this.x = function(){alert('apple');}
this.y = function(callback){
if(typeof callback == 'undefined' || callback == null)
alert('argh')
else
callback();
}
}
var foo = function(){alert('blah')};
var x = new a();
x.y(this.x); // why is this one undefined
x.y(foo); // works as expected
这是jsfiddle链接:http://jsfiddle.net/W7FyZ/2/
当我传入对象成员函数时,为什么它未定义?有没有办法将对象成员函数作为回调传递?
答案 0 :(得分:4)
执行x.y(this.x)
时,this
是对窗口的引用,而不是a
的实例。我想你的意图是:
x.y(x.x);
由于x
是a
的一个实例,因此会将此x
实例的a
方法的引用传递给此y
方法a
的实例。
执行x.y(foo)
时,foo
是在此范围内声明的函数,因此您将foo
函数的引用传递给y
x
方法}}
答案 1 :(得分:0)
我刚刚重命名了你的变量以清除混乱。
var a = function(){
this.x = function(){alert('apple');}
this.y = function(callback){
if(typeof callback == 'undefined' || callback == null)
alert('argh')
else
callback();
}
}
var foo = function(){alert('blah')};
现在,在执行部分:
var myA = new a();
上面一行是赋值函数a()变量'myA'。因此,x()
的函数y()
和a()
应该被称为myA.x()
和myA.y()
。
x.y(myA.x); // it works
x.y(this.myA.x) // This also works as this is a current window
x.y(foo); // works as expected
答案 2 :(得分:0)
西蒙·贝茨(Simon Bates)有一个很好的讨论,包括多种方法来实现这一目标: http://bitstructures.com/2007/11/javascript-method-callbacks.html