1. 程式人生 > >JavaScript中的高階函式

JavaScript中的高階函式

之前寫的《JavaScript學習手冊》,客戶跟我說有些內容不適合初學者,讓我刪了,感覺挺可惜的,拿到這裡和大家分享。

JavaScript中的一切都是物件,這句話同樣適用於函式。函式物件可以作為函式的引數。

一 函式物件作為另一個函式的引數

函式可以作為另外一個函式的引數,這裡的“另外一個函式”可以返回具體的值,也可以返回一個函式。第二種情況就是函式的函式,稱為高階函式。在介紹這兩種情況之前,先了解一下 call() 和 apply() 方法:

call()  的使用方式為 被呼叫的函式.call(呼叫者,引數1,引數2....),功能為:呼叫者呼叫被呼叫的函式,並傳入引數列表。

apply() 的使用方式為 被呼叫的函式.apply(呼叫者,引數組成的陣列),功能為:呼叫者呼叫被呼叫的函式,並傳入引數陣列。

call() 和 apply() 裡面如果傳入的第一個引數是 this ,表示的是函式的呼叫者。

1 var store = {name:"myStore", id:5622};
2 function getSalesVolume(a, b) {
3     return a + b;
4 }
5 //store後面有兩個引數
6 getSalesVolume.call(store, 40000, 50000);//返回90000
7 //store後面是一個引數陣列,長度為2
8 getSalesVolume.apply(store, [40000, 50000]);//
返回90000

二 返回值

一個函式作為另外一個函式的引數,並最終返回一個值。

 1 //求最大值
 2 function getMax(a, b) {
 3     return a > b ? a : b;
 4 }
 5 //求最小值
 6 function getMin(a, b) {
 7     return a < b ? a : b;
 8 }
 9 //下面這個函式以函式作為引數,並最終返回一個值
10 function getM(func, num1, num2) {
11     return func(num1, num2);
12 }
13 getM(getMax, 1, 2);//
返回2 14 getM(getMin, 1, 2);//返回1

 getM() 的第一個引數是函式的名字,但是不能用雙引號包含在內。

三 高階函式

高階函式的輸入是函式,輸出也是函式。即一個函式呼叫另外一個函式,然後返回一個新的函式。比如通過呼叫求兩個數的最大值的函式,實現求n個數的最大值的函式,就可以用到高階函式來實現:

 1 //求最大值
 2 function twoMax(a, b) {
 3      return a > b ? a : b;
 4 }
 5 function getMax(func) {
 6     return function() { //返回一個匿名函式
 7         var aLength = arguments.length;
 8         var result = 0;
 9         for (var i = 0;i < aLength;i++) {
10             result = func.call(this, result, arguments[i]);
11         }
12         return result;
13     };
14 }
15 var multiMax = getMax(twoMax);
16 console.log(multiMax(1, 2, 3, 4));//輸出4

上面的 getMax() 函式在傳入實參 twoMax() 函式後,會返回一個新的函式 multiMax() ,用來求多個數的最大值。getMax() 每次求兩個數的最大值,然後再將這個最大值與第三個數比較,求最大值,這樣一直進行下去,就可以求得多個數的最大值。