2012-01-29 186 views
6

在下面的代碼中,我可以使用print來代替console.log,程序可以正常運行。不過,我想使用的console.log但我得到如何將console.log作爲參數傳遞給我的JavaScript函數?

非法調用

在運行時

function forEach(array, action) { 
    for (var i=0; i<array.length; i++) 
     action(array[i]); 
} 

forEach(["blah", "bac"], console.log); 
+0

如果你只傳遞了'console'和調用'log'內它將工作forEach功能。 – 2016-01-22 13:31:35

回答

7

一般而言,您不能直接將方法傳遞給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('->')); 
4

從這裏:Create shortcut to console.log() in Chrome

您可以console.log.bind(console)

更換 console.log

解釋感謝@朱利安-d:

因爲console.log將在內部參考this,並預計其 是console。如果您「分離」了log方法,例如如var log = console.log,此關聯丟失,並且這將不再指向 console(在這種情況下爲window而不是 - 如果您在瀏覽器中)。 這是.bind(obj)的用途:它返回 內部this保持固定爲obj的方法。

+0

但爲什麼你不能'log = console.log'呢? – meze 2012-01-29 10:20:17

+2

@meze:因爲'console.log'將內部引用到'this'並且期望它是'console'。如果'分離''log'方法,例如就像'var log = console.log'一樣,這個關聯會丟失,'this'將不再指向'console'(在本例中爲'window'而不是 - 如果你在瀏覽器中)。這就是'.bind(obj)'的用途:它返回一個方法,在這個方法中'this'保持固定爲'obj'。 – 2012-01-29 11:24:25

+0

請記住,「綁定」在所有瀏覽器中都不可用。請參閱@frm的答案,瞭解不需要「綁定」的解決方案。 – 2012-01-29 15:50:33

3

可以使用作爲forEach()console.log()

forEach(["blah", "bac"], function (element) { 
    console.log(element); 
}); 

之間的橋樑匿名函數你forEach()仍不可​​知有關處理程序,你不必與bind()兼顧傳遞一個解決問題工作參考console.log()

相關問題