高階函數是函數式編程的一種代碼實現方案,通常把接受一個或多個函數做爲參數,或者返回一個函數的函數叫作高階函數。
js中最多見的一些高階函數如閉包(返回函數),一些內置函數(傳入函數)等。編程
例:
reduce接受兩個參數,返回操做後的數據。數組
參數一(必須):函數累計器,聲明要對數組的每個值執行的操做,累計器默認被傳入四個參數,分別表示累計器上一次返回累計值,數組正在處理的元素,正在處理的元素下標,調用reduce的數組;其中前兩個必選,後兩個可選。緩存
參數二(可選):聲明累計器的初始值,沒有的話默認選擇數組的第一個元素做爲累計器的第一個值。閉包
常見錯誤函數式編程
當對空數組執行reduce操做時,必須指定參數二,保證累加器有一個初始值,不然會報錯,如上圖。函數
上圖的代碼執行順序性能
例:
普通用法測試
數組包含空元素this
複雜數組spa
回調函數全部參數
map可選參數測試
map接受兩個參數
參數一(必須):一個回調函數,這個函數會被自動傳入三個參數分別表示數組元素,數組下標,數組自己;函數內聲明對原數組的每一項作的指定操做,並將獲得的數據放入一個新數組並返回;
參數二(可選):用來指定回調函數中this的指向
常見錯誤
將\['1','2','3'\]轉換爲數字數組
轉換數字能夠用parseInt,parseFloat,Number等方法,依次試驗一下,結果以下:
這時候發現傳入parseInt做爲轉換函數得不到想要的結果,回想一下,map接受的函數參數會被默認傳入三個參數,而實際上,parseInt在使用過程當中是能夠接受兩個參數的,第一個是解析的字符串,而第二個可選的參數,用來表示轉換的進制,嘗試一下:
因此錯誤的緣由來自於此,當parseInt做爲map的參數時,第二個參數被傳入數組的下標,致使得不到想要的結果。
而parseFloat和Number則不存在這個問題。由於這兩個函數都是智能接收一個字符串參數,而且返回轉換後的結果。
示例:
filter接受兩個參數
參數一(必選) 回調函數,指定過濾條件,回調函數接收三個參數,如上圖所示,分別爲當前處理的數組元素,當前處理的數組下標,調用filter的數組自己,而且返回一個過濾條件,符合條件的數組元素會被放入新數組返回;
參數二(可選) 同map,用來指定回調函數中this的指向;
經過高階函數,咱們還能夠實現一些諸如函數緩存,函數柯里化等來提升js代碼的性能及可讀性,這個下次在說