用高階函數實現地址的延遲搜索

原文javascript

高階函數

在javascript中高階函數實際上就是控制函數的函數,有別於普通函數傳遞變量,高階函數傳遞的是函數,而且輸出函數html

這對於js初學者來講足夠燒腦,也足夠驚豔。
初識時經常會被被震撼了,原來函數還能夠這麼用java

var getSingle = function( fn ){
    var result;
    return function(){
        return result || ( result = fn .apply(this, arguments ));
    } 
};

這是《JavaScript設計模式與開發實踐》的單例模式的一個高階函數。git

地址延遲搜索

default

對於地址輸入頁面,咱們經常要定位用戶的地址,爲了保證定位的地址是用戶輸入的完整地址,咱們須要對輸入進行延遲處理,用過外賣軟件的你們確定至關熟悉。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

html代碼中input用來獲取用戶輸入,div用來展現用戶輸入定位到的地址,實際工做中咱們會調用地圖api異步獲取位置信息再展現出來,這裏簡化爲延遲輸出用戶的輸入api

javascript

其中
fetch函數用來實現異步獲取數據的功能
search函數生成具體的延遲1500ms處理的fetch函數
debounce函數用來實現對於fn的延遲處理,它能建立一個函數用來實現:app

  • 清除一次的計時器異步

  • 建立一個新的計時器函數

這裏debounce其實就是一個高階函數,他抽象了一個處理fn的過程,它能夠處理任意須要該過程的函數fn而不用在乎fn具體是什麼。這體現了函數的冪等性。

小結

這樣具備冪等性高階函數雖然初見時可能以爲抽象且難以理解,但其不只體現了數學上邏輯性,也因爲它高度抽象使得基本不會被外部變量影響,能夠輕鬆地寫出測試用例,能夠重複地用在須要該邏輯的腳本中不易出錯。

相關文章
相關標籤/搜索