2012-06-16 83 views
6

我在學習javascript。我知道我們可以在函數定義後將函數傳遞給其他函數。但我需要幫助的理解這個例子:javascript:傳遞函數

function map(func, array) { 
    var result = []; 
    forEach(array, function (element) { 
    result.push(func(element)); 
    }); 
    return result; 
} 

從我可以理解,FUNC是地圖的論點。我需要提供一個函數作爲func。但是在我正在閱讀的教程中,它沒有提到這個函數來自哪裏,似乎沒有必要指定這個參數?本教程中的另一個示例是相同的:

function count(test, array) { 
    return reduce(function(total, element) { 
    return total + (test(element) ? 1 : 0); 
    }, 0, array); 
} 

此測試函數等於元素=== 0? 1:0,但教程沒有說我需要寫下測試函數。我是否需要編寫這個測試函數?

+0

教程在哪裏? –

+0

也許是[w3schools](http://www.w3schools.com/)。 –

+0

http://eloquentjavascript.net/chapter6.html#p31aabc64 – Jenny

回答

4

編輯:在鏈接到您發佈的教程,通過功能是一個預先定義的函數Math.round。我下面的例子顯示了創建你自己的函數來傳遞。


map示例顯示了實現。當您致電map時,您會提供該功能(和陣列)。

從它的外觀來看,map將數組中的當前項傳遞給函數,並且函數應該對它做些什麼並返回結果。你的函數返回的結果被添加到新的數組中。

var arr = [1,2,3,4,5]; 
var my_func = function(item) { return item * 2; }; 

var new_arr = map(my_func, arr); 

console.log(new_arr); // [2,4,6,8,10] 
  1. 我們創建了一個數組arr

  2. 我們創建了一個功能my_func,這需要無論它給,並通過2

  3. 相乘
  4. 我們通過了map

  5. map函數迭代我們的arr,將每次迭代中的當前項傳遞給我們的函數。

  6. 我們的函數接受當前項,並返回2.

  7. 的相乘的結果map函數接受這一結果,並把它添加到新陣列。

  8. 迭代完成後,map函數返回新的Array。

+0

感謝您的幫助。在閱讀你的答案後,我發現等於是功能測試。 – Jenny

0

當您調用map時,您將傳遞一個內聯函數或一個現有函數。

// The following would return [2,3,4] 
map(function(item) { return item + 1}, [1,2,3]); 

function double(item) {return item*2} 
map(double, [1,2,3]) 
// returns [2,4,6] 

// Your example, Math.round 
map(Math.round, [0.01, 2, 9.89, Math.PI]) 
// returns [0,2,10,3] 

另一種說法是,函數可以像任何其他參數一樣傳遞給另一個函數。這與函數就像任何其他變量可以從函數傳遞或返回一樣。

function createAdder(toAdd) { 
    return function (num) { 
     return num + toAdd; 
    } 
} 

var add5 = createAdder(5); 
add5(2); // returns 7 


var add7 = createAdder(7); 
add7(-2); // returns 5