一般情况下,您不能将方法直接传递给 Javascript 中的回调。 this 绑定在函数调用点,具体取决于您调用它的形式,并且没有自动方法的绑定(例如在 Python 中)
//does not work.
var obj = {
x: 17,
f: function(){ return this.x; }
};
//inside doSomething, f forgets its "this" should be obj
doSomething( obj.f )
在这些情况下,可以使用Function.prototype.bind(或您选择的库中的类似函数,因为bind 在IE
//works (for normal methods - see next bit for console.log in particular)
var obj = {
x: 17,
f: function(){ return this.x; }
};
doSomething( obj.f.bind(obj) )
不幸的是,这对于 console.log 来说并不总是足够的。 因为它不是 IE 中的实际函数,(它是一个邪恶的宿主对象)你不能使用绑定、应用和调用方法在那个浏览器上,所以唯一的解决方法是回退到将调用包装在一个匿名函数中
doSomething( function(x){
return console.log(x);
});
由于在匿名函数中包装 console.log 很长而且输入起来很烦人,我通常在开发和调试时添加以下全局函数:
function log(message){ return function(x){
return console.log(message, x);
};};
forEach(['asd', 'zxc'], log('->'));