上篇文章介紹了純函數,相信你已經理解了純函數的概念。下面咱們接着看一段代碼面試
let minimum = 21; let checkAge = age => age >= minimum // 純的 let checkAge = age => { let minimum = 21; return age >= minimum; };
純函數把關鍵字18硬編碼在函數內部,擴展性差,那咱們如何解決呢?segmentfault
let checkAge =(minimum, age) => age >= minimum
機智如你確定會想到經過一個參數將經過傳參數將minimum傳遞進去,很好,這樣很機智的解決了問題,但是若是狀況是這樣的呢?數組
let minimum = x => x * 2; let checkAge = age => age >= minimum(2)
咱們怎麼把這段代碼改爲純函數,且不是硬編碼的呢?
咱們能夠將一個函數做爲參數傳遞。閉包
在函數式語言中,函數是這個語言中的一等公民。通俗來說,函數僅僅是另外一種值而已,他與村口的"劉能" "趙四"
這類js其餘數據類型同樣,把它們存在數組裏,看成參數傳遞,賦值給變量...等等。函數
let checkAge =(age, minimum) => age >= minimum(2)
咱們的新函數就稱爲高階函數(Higher-order Function)。編碼
高階函數能夠接收函數做爲參數,或者返回一個函數結果,或者二者同時具有。
下面咱們看另外一個高階函數code
let makeAdder = x => (y => x + y); let add10 = makeAdder(10); add10(10); //20
咱們經過向makeAdder函數傳遞一個常量10來建立一個函數add10,add10將給任意值加上10。
這個makeAdder裏面的匿名函數就是咱們常常被面試官用來壓壓驚的大名鼎鼎的閉包,這個行爲很是的重要,由於若是沒有它,可以返回函數的函數不是頗有用。
當一個函數被建立,其整個生命週期中都是能夠訪問在在其建立時做用域內的全部變量。只要有引用指向它該函數就會一直存在。生命週期