2016-02-15 198 views
1

我有一個問題,這個問題現在已經困擾了我一陣子。JavaScript:如何將額外參數傳遞給回調函數

比方說,我有以下的數組:

var array = [1, 2, 3] 

現在我有一個類似的功能:

function print(num, str) { 
    console.log(str + ": " + num); 
} 

是否可以調用的forEach方法和一個字符串傳遞給它?

// how do I pass "str"? 
array.forEach(print); 

謝謝!

回答

3

你這裏有兩種選擇:

要麼你交換參數,使str是第一位的。然後你可以使用function.bind綁定函數的第一個參數:

function print(str, num) { 
    console.log(str + ": " + num); 
} 

array.forEach(print.bind(null, 'someStr')); 

或者,你也可以創建一個新的(匿名)函數,它只是將一些價值的第二個參數:

array.forEach(function (item) { print(item, 'someStr'); }); 

隨着ES6和箭頭的功能,這甚至變得有點漂亮:

array.forEach(item => print(item, 'someStr')); 

這兩種解決方案有一個非常類似的效果,他們創造一個新的函數對象,然後傳遞給forEach。什麼對你更有意義取決於你的用例。

就像一個說明:你只需要記住,傳遞給forEach的回調實際上最多需要三個參數(項目,項目的索引和數組本身),所以在傳遞一個函數時要小心接受其他附加參數。您可以再次使用本地功能來解決該問題。

2

不是在這種特殊情況下。這裏簡單的解決方法是使用匿名函數包裝:

array.forEach(function (i) { print(i, str); }); 

如果顛倒了參數print,你可以這樣做多了幾分優雅,像這樣:

function print(str, num) { .. }; 

array.forEach(print.bind(null, str)); 

str將被綁定爲第一個參數,forEach在調用回調時通過的任何參數在第二,第三等地方傳遞。

+1

FWIW:那第二個選項有時被稱爲*部分應用程序*或*鑽營*(後[哈斯克爾庫裏](https://en.wikipedia.org/wiki/Haskell_Curry) )在函數式編程領域。 –

0

在這裏你去

var array = [1, 2, 3]; 

function print(str, num) { 
    console.log(str + ": " + num); 
} 

var str = 'someString'; 
array.forEach(print.bind(null, str)); 
相關問題