一般而言,您不能直接將方法傳遞給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 < = 8)
//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);
});
由於包裝控制檯。登錄匿名函數是漫長的,討厭的類型我通常添加的時候我正在開發以下全局函數和調試:
function log(message){ return function(x){
return console.log(message, x);
};};
forEach(['asd', 'zxc'], log('->'));
如果你只傳遞了'console'和調用'log'內它將工作forEach功能。 – 2016-01-22 13:31:35