JavaScript防抖與節(jié)流的實現與注意事項
更新時間:2022年03月31日 10:23:30 作者:_雪菜肉絲面_
防抖和節(jié)流嚴格算起來應該屬于性能優(yōu)化的知識,但實際上遇到的頻率相當高,處理不當或者放任不管就容易引起瀏覽器卡死,下面這篇文章主要給大家介紹了關于JavaScript防抖與節(jié)流的實現與注意事項,需要的朋友可以參考下
概念
防抖:點擊N次提交按鈕,只有最后一次會發(fā)出請求。減少無效請求的次數。
節(jié)流:每點擊一次按鈕,都會失效一段時間。降低觸發(fā)的頻率。
實現
/*
防抖
時限內,只有最后一次調用會執(zhí)行
*/
function debounce(func, interval = 0) {
let timer;
return function () {
if (timer) {
clearTimeout(timer);
}
timer = setTimeout(() => {
func()
}, interval)
}
}
/*
節(jié)流
執(zhí)行之后會失效一段時間
*/
function throttle(fn, interval=0, immediate=true) {
let valid = true
return function () {
if (!valid) {
return
}
valid = false
if (immediate) {
fn()
setTimeout(() => {
valid = true;
}, interval)
} else {
setTimeout(() => {
fn()
valid = true;
}, interval)
}
}
}測試
function say() {
console.log(1)
}
var a = debounce(say, 1000)
var b = throttle(say, 1000)
var c = throttle(say, 1000, false)
<button onclick="a()">測試防抖</button>
<button onclick="b()">測試節(jié)流一</button>
<button onclick="c()">測試節(jié)流二</button>
效果:
防抖。

節(jié)流,立即執(zhí)行。

節(jié)流,延時執(zhí)行。

注意事項
原理:閉包。每調用一次都會對應一個閉包。
不能夠像下面這樣寫:
<button onclick="debounce(say, 1000)()">測試防抖</button> <button onclick="throttle(say, 1000)()">測試節(jié)流一</button> <button onclick="throttle(say, 1000, false)()">測試節(jié)流二</button>
不然:

總結
到此這篇關于JavaScript防抖與節(jié)流的實現與注意事項的文章就介紹到這了,更多相關JS防抖與節(jié)流內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Ajax,UTF-8還是GB2312 eval 還是execScript
討厭的東西。 關于Ajax獲取HTML內容編碼,與JavaScript載入腳本的動態(tài)執(zhí)行問題。2008-11-11
微信小程序web-view無法打開該頁面不支持打開的解決方法
小程序現在日漸成熟,功能也越來越強大,我們今天來一起看看小程序跳轉的問題,下面這篇文章主要給大家介紹了關于微信小程序web-view無法打開該頁面不支持打開的解決方法,需要的朋友可以參考下2023-01-01
關于document.cookie的使用javascript
設置cookie 每個cookie都是一個名/值對,可以把下面這樣一個字符串賦值給document.cookie:2008-04-04

