JavaScript中的高階函式
阿新 • • 發佈:2018-10-31
之前寫的《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() 每次求兩個數的最大值,然後再將這個最大值與第三個數比較,求最大值,這樣一直進行下去,就可以求得多個數的最大值。