原文javascript
在javascript中高階函數實際上就是控制函數的函數,有別於普通函數傳遞變量,高階函數傳遞的是函數,而且輸出函數html
這對於js初學者來講足夠燒腦,也足夠驚豔。
初識時經常會被被震撼了,原來函數還能夠這麼用java
var getSingle = function( fn ){ var result; return function(){ return result || ( result = fn .apply(this, arguments )); } };
這是《JavaScript設計模式與開發實踐》的單例模式的一個高階函數。git
對於地址輸入頁面,咱們經常要定位用戶的地址,爲了保證定位的地址是用戶輸入的完整地址,咱們須要對輸入進行延遲處理,用過外賣軟件的你們確定至關熟悉。github
實現這一流程的一種以下:設計模式
html
<body> <form action=""> <input type="text" id="content"> <div id="result"></div> </form> </body>
javascript
var content = document.querySelector('#content') var result = document.querySelector("#result") var debounce = function(fn, delay) { var timer = null return function(...args) { clearTimeout(timer); timer = setTimeout(() => fn.apply(this, args), delay); } } var fetch = function() { // 異步定位 result.innerHTML = `你搜索的是${content.value}` } var search = debounce(fetch, 1500) content.addEventListener("input", search)
html代碼中input用來獲取用戶輸入,div用來展現用戶輸入定位到的地址,實際工做中咱們會調用地圖api異步獲取位置信息再展現出來,這裏簡化爲延遲輸出用戶的輸入api
其中fetch函數
用來實現異步獲取數據的功能search函數
生成具體的延遲1500ms處理的fetch函數debounce函數
用來實現對於fn的延遲處理,它能建立一個函數用來實現:app
清除一次的計時器異步
建立一個新的計時器函數
這裏debounce其實就是一個高階函數,他抽象了一個處理fn的過程,它能夠處理任意須要該過程的函數fn而不用在乎fn具體是什麼。這體現了函數的冪等性。
這樣具備冪等性高階函數雖然初見時可能以爲抽象且難以理解,但其不只體現了數學上邏輯性,也因爲它高度抽象使得基本不會被外部變量影響,能夠輕鬆地寫出測試用例,能夠重複地用在須要該邏輯的腳本中不易出錯。