日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JavaScript函数节流(throttle)与函数去抖(debounce)解析与应用举例

發布時間:2023/12/31 javascript 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaScript函数节流(throttle)与函数去抖(debounce)解析与应用举例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概念

函數防抖(debounce):
事件響應函數在一段時間后才會執行,如果在這段時間內再次調用,則重新計算執行時間;當預定時間內沒有再次調用該函數,則執行響應邏輯。

函數節流(throttle):
可以理解為在函數防抖上多加了一個功能:函數節流會預定一個自動執行時間,到時自動執行一次。

共同點:
函數節流與函數防抖都是為了限制函數的執行頻次,是一種性能優化的方案,比如應用于window對象的resize、scroll事件,拖拽時的mousemove事件,文字輸入、自動完成的keyup事件。

舉例

以百度搜索為例:用戶搜索輸入時,邊輸入會邊提示搜索內容,如下:

從網絡請求來看,百度是監聽了鍵盤輸入,按一次鍵就發一次請求,如下:

對于百度來說,這樣自然沒什么問題,畢竟服務器強大,這點消耗不算什么,但在我們看來,有什么可以優化的呢?
方案一:在用戶沒有輸入的m毫秒后再發送請求(函數去抖)
方案二:在用戶沒有輸入的m毫秒后再發送請求,但期間每隔n毫秒會自動發一次請求(函數節流)

函數去抖實現

實現用戶停止輸入1秒后開始發送搜索請求,以下實現不注重樣式,僅實現需求。

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>函數去抖</title> </head> <body><h4>函數去抖實現</h4><input type="text"><div class="show"></div> </body> <script>var input = document.getElementsByTagName('input')[0]input.addEventListener('keyup', function () {debounce(doSearch, window, this.value)})function doSearch (searchText) {var p = document.createElement('p')p.innerText = '當前搜索內容: ' + searchTextdocument.getElementsByClassName('show')[0].appendChild(p)}function debounce (fn, context, searchText) {clearTimeout(this.timer) // 關鍵點:1000ms內重復調用則清除timerthis.timer = setTimeout(function() { fn.call(context, searchText) // 調用函數fn,context為fn所屬作用域}, 1000) } </script> </html>

運行結果:

函數節流實現

以下實現用戶停止輸入2秒后發搜索請求,期間每隔500ms發一次搜索請求。

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>函數節流</title> </head> <body><h4>函數節流實現</h4><input type="text"><div class="show"></div> </body> <script>var input = document.getElementsByTagName('input')[0]input.addEventListener('keyup', function() {throttle(doSearch, window, this.value, 500, 2000)})function doSearch (searchText) {var p = document.createElement('p')p.innerText = '當前搜索內容: ' + searchTextdocument.getElementsByClassName('show')[0].appendChild(p)}// (調用方法, 方法所屬對象, 自動執行時間, 最大延遲執行時間 ))function throttle (fn, context, searchText, autoDoTime, delay) {clearTimeout(fn.timer)// 記錄當前時間fn.currentTime = Date.now()// 若該函數是第一次調用,則直接設置startTime,即開始時間,為currentTime,即此刻的時間if(!fn.startTime){ fn.startTime = fn.currentTime}// 大于等于自動執行時間,調用方法if(fn.currentTime - fn.startTime >= autoDoTime){fn.call(context, searchText)fn.startTime = fn.currentTime} else {// 大于最大延遲時間,調用方法fn.timer = setTimeout(function(){fn.call(context, searchText)}, delay)}} </script> </html>

運行結果:

相關解釋請參考代碼中的注釋。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的JavaScript函数节流(throttle)与函数去抖(debounce)解析与应用举例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。