標籤:javascript回呼函數 javascript高階函數 javascript
JavaScript API裡這樣解釋:A callback is a function that is passed as an argument to another function and is executed after its parent function has completed. (回調是一個函數作為參數傳遞給另一個函數,其母函數完成後執行。)
使用回呼函數的原因:可以把調用者與被調用者分開。調用者不關心誰是被調用者,所有它需知道的,只是存在一個具有某種特定原型、某些限制條件(如返回值為int)的被調用函數。
一、使用函數處理數組求數組的平均值
方法一(常規方式):
var data = [1,1,3,5,5];var sum = 0;for(var i=0; i<data.length; i++){sum += data[i];}console.log(sum / data.length);方法二(函數式):
var data = [1,1,3,5,5];var sum = function(x,y){return x+y;};console.log(data.reduce(sum)/data.length);PS:對數組中的所有元素調用指定的回呼函數;返回值為通過最後一次調用回呼函數獲得的累積結果。
array1.reduce(callbackfn[, initialValue])
如果提供了 initialValue,則 reduce 方法會對數組中的每個元素調用一次 callbackfn 函數(按升序索引順序)。 如果未提供 initialValue,則 reduce 方法會對從第二個元素開始的每個元素調用 callbackfn 函數。
回呼函數的返回值在下一次調用回呼函數時作為 previousValue 參數提供。 最後一次調用回呼函數獲得的返回值為 reduce 方法的返回值。
var data = [1,2,3];
data.reduce(function(x,y){return x+y},2); //8
data.reduce(function(x,y){return x+y}); //6
二、回呼函數樣本:資料來源為某學生分數,當score<=0由底層處理,當score>0由高層處理。
/* 回呼函數 */function f(score,callback1,callback2){if(score <= 0){console.log("調用底層處理函數")/* 使用call函數傳參數 */callback1.call(this,score);}else{console.log("調用高層處理函數");/* 使用apply函數傳參數 */callback2.apply(this,[score]);}}
/* 底層函數 */function subprocess(score){score === 0 ? console.log("該學生未參加考試!") : console.log("輸入錯誤!");}/* 高層函數 */function supprocess(score){if(score >= 90){console.log("該學產生績優秀!");}else if(score >= 80) {console.log("該學產生績良好!");}else if(score >= 60){console.log("該學產生績及格!");}else{console.log("該學產生績不及格!");}}
/* 匿名函數 */var score = 99;f(score,function(){score === 0 ? console.log("該學生未參加考試!") : console.log("輸入錯誤!");},function(){if(score >= 90){console.log("該學產生績優秀!");}else if(score >= 80) {console.log("該學產生績良好!");}else if(score >= 60){console.log("該學產生績及格!");}else{console.log("該學產生績不及格!");}})三、高階函數所謂高階函數就是操作函數的函數,它接收一個或多個函數作為參數,並返回一個新的函數。
/* 高階函數,返回f的傳回值的邏輯非 */function not(f){return function(){var result = f.apply(this,arguments);return !result;};}/* 判斷x是否為偶數的函數 */var even = function(x){return x % 2 === 0;};var odd = not(even);//一個新函數,所做的事情和even()相反[1,1,3,5,5].every(odd); //true,每個元素都是奇數
JavaScript回呼函數