成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

再也不怕面試官問我防抖與節流了

開發 后端
防抖就是要延遲執行,你一直操作觸發事件一直不執行,當你停止操作等待多少秒后才執行,節流顧名思義,一節一節的流,就好似控制水閥,在事件不斷觸發的過程中,固定時間內執行一次事件。

最近去面試,又遇到面試官問我防抖與節流了,而明明前幾天就看過手寫代碼,卻寫不出來。有時候我在想,是不是自己太笨了。

回歸正題

防抖

先不說概念,按自己的理解,在單反里,有防抖機制。因為人在拿著單反的時候會手抖(單反重),按下快門的瞬間,照片會糊,所以有防抖機制,以防止新手把照片拍糊。

單反中的防抖是防止抖動,讓人拍出清晰的照片,JavaScript 中的防抖是為了什么?

同理,它的作用也是防止抖動。試想當你頻繁觸發一個事件時,就會引起不必要的性能損失,那么讓該事件在停止觸發后再觸發,以此減少部分性能。

防抖的定義

防抖就是要延遲執行,你一直操作觸發事件一直不執行,當你停止操作等待多少秒后才執行。

也就是說不管事件觸發頻率有多高,一定在事件觸發 n 秒后執行。如果在事件觸發的 n 秒又觸發了這個事件,那就以新事件的事件為準,n 秒后才執行。總之,要等你觸發完事件 n 秒內不再觸發事件,它才執行。

手寫防抖

根據定義,我們知道要在時間 n 秒后執行,那么我們就用定時器來實現:

function debounce(event, wait) {
let timer = null;
return function (...args) {
clearTimeout(timer); // 清除setTimeout,使其回調函數不執行
timer = setTimeout(() => {
event.apply(this, args)
}, wait)
}
}

代碼很簡單,即當還在觸發事件時,就清除 timer,使其在 n 秒后執行,但此寫法首次不會立即執行,為其健壯性,需加上判斷是否第一次執行的第三個參數 flag,判斷其是否立即執行。

function debounce(event, wait, flag) {
let timer = null;
return function (...args) {
clearTimeout(timer)
if (!timer && flag) {
event.apply(this, args)
} else {
timer = setTimeout(() => {
event.apply(this, args)
}, wait)
}
}
}

防抖場景

窗口大小變化,調整樣式

window.addEventListener('resize', debounce(handleResize, 200))

搜索框,輸入后1000毫秒搜索

debounce(fetchSelectData, 300)

表單驗證,輸入 1000 毫秒后驗證

debounce(validator, 1000)

防抖帝王庫

兩大工具庫都有防抖源碼,可供參考:

  • lodash-debounce。
  • underscore-debounce。

節流

顧名思義,一節一節的流,就好似控制水閥,在事件不斷觸發的過程中,固定時間內執行一次事件。

手寫節流

因為是固定時間內執行一次時間,所以我們有兩種實現方法,一用時間戳,二用定時器。

時間戳

function throttle(event, wait) {
let pre = 0;
return function (...args){
if (new Date() - pre > wait) {
// 當 n 秒內不重復執行
pre = new Date();
event.apply(this, args)
}
}
}

使用時間戳雖然能實現節流,但是最后一次事件不會執行。

定時器

function throttle(event, wait) {
let timer = null;
return function (...args) {
if (!timer) {
timer = setTimeout(() => {
timer = null;
event.apply(this, args)
}, wait)
}
}
}

使用定時器實現節流,雖然最后一次能觸發,但是第一次不會觸發。

時間戳 + 定時器。

為解決第一次和最后一次都可以觸發,把兩者結合起來。

function throttle(event, wait) {
let pre = 0, timer = null;
return function (...args) {
if (new Date() - pre > wait) {
clearTimeout(timer);
timer = null;
pre = new Date();
event.apply(this, args)
} else {
timer = setTimeout(() => {
event.apply(this, args)
}, wait)
}
}
}

節流場景

scroll 滾動

window.addEventListener('scroll', throttle(handleScroll, 200))

input 動態搜索

throttle(fetchInput, 300)

節流帝王庫

  • lodash-throttle。
  • underscore-throttle。

總結

防抖:只執行最后一次。事件持續觸發,但只有等事件停止觸發后 n 秒后才執行函數。

節流:控制執行頻率。持續觸發,每 n 秒執行一次函數。

對比圖:

責任編輯:姜華 來源: 今日頭條
相關推薦

2021-05-08 07:53:33

面試線程池系統

2020-11-24 07:48:32

React

2021-08-10 18:36:02

Express原理面試

2020-10-20 09:12:57

axios核心原理

2022-08-27 13:49:36

ES7promiseresolve

2020-10-23 09:26:57

React-Redux

2023-11-28 17:49:51

watch?computed?性能

2022-10-31 11:10:49

Javavolatile變量

2020-10-15 12:52:46

SpringbootJava編程語言

2021-04-22 07:49:51

Vue3Vue2.xVue3.x

2021-12-02 08:19:06

MVCC面試數據庫

2020-04-30 10:24:35

Spring循環依賴Java

2019-06-17 05:03:37

memcache內核架構

2023-12-18 07:37:17

JavaScript防抖節流

2020-04-16 08:22:11

HTTPS加解密協議

2021-05-20 08:54:16

Go面向對象

2010-08-23 15:06:52

發問

2022-05-24 08:03:28

InnoDBMySQL數據

2021-08-03 06:57:36

Js事件節流

2021-06-03 08:55:54

分布式事務ACID
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 伊人在线| 91精品久久久久久综合五月天 | 久久99蜜桃综合影院免费观看 | 91精品久久久久久久久中文字幕 | 久久精品国产99国产 | 日本精品视频 | 一区视频 | 国产精品久久久久久久久图文区 | 黄色毛片在线看 | 欧美黄页 | 精品久久久久久久久久久下田 | 天堂中文在线播放 | 久久国产精品免费 | 日韩av高清 | 91精品国产综合久久久久 | 亚洲精品二区 | www国产成人免费观看视频,深夜成人网 | 久久免费精彩视频 | 日韩一区在线观看视频 | 欧美精品一区二区三区在线播放 | 97成人免费 | 欧美一级大片 | 亚洲欧美一区二区三区国产精品 | 在线视频 亚洲 | 久久久久久国产 | 免费a网| 午夜大片 | 欧美日韩在线综合 | 亚州av在线 | 久久久免费在线观看 | 中文字幕第100页 | 日韩精品a在线观看图片 | 国产a级毛毛片 | av日韩在线播放 | 久久9精品 | 精品一二三区在线观看 | 黄色一级大片在线免费看产 | 91精品综合久久久久久五月天 | 精品国产99| 欧美aaaa视频| 久久国产香蕉 |