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

再也不怕面試官問我防抖與節(jié)流了

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

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

回歸正題

防抖

先不說概念,按自己的理解,在單反里,有防抖機(jī)制。因?yàn)槿嗽谀弥鴨畏吹臅r(shí)候會(huì)手抖(單反重),按下快門的瞬間,照片會(huì)糊,所以有防抖機(jī)制,以防止新手把照片拍糊。

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

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

防抖的定義

防抖就是要延遲執(zhí)行,你一直操作觸發(fā)事件一直不執(zhí)行,當(dāng)你停止操作等待多少秒后才執(zhí)行。

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

手寫防抖

根據(jù)定義,我們知道要在時(shí)間 n 秒后執(zhí)行,那么我們就用定時(shí)器來實(shí)現(xiàn):

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

代碼很簡單,即當(dāng)還在觸發(fā)事件時(shí),就清除 timer,使其在 n 秒后執(zhí)行,但此寫法首次不會(huì)立即執(zhí)行,為其健壯性,需加上判斷是否第一次執(zhí)行的第三個(gè)參數(shù) flag,判斷其是否立即執(zhí)行。

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)
}
}
}

防抖場景

窗口大小變化,調(diào)整樣式

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

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

debounce(fetchSelectData, 300)

表單驗(yàn)證,輸入 1000 毫秒后驗(yàn)證

debounce(validator, 1000)

防抖帝王庫

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

  • lodash-debounce。
  • underscore-debounce。

節(jié)流

顧名思義,一節(jié)一節(jié)的流,就好似控制水閥,在事件不斷觸發(fā)的過程中,固定時(shí)間內(nèi)執(zhí)行一次事件。

手寫節(jié)流

因?yàn)槭枪潭〞r(shí)間內(nèi)執(zhí)行一次時(shí)間,所以我們有兩種實(shí)現(xiàn)方法,一用時(shí)間戳,二用定時(shí)器。

時(shí)間戳

function throttle(event, wait) {
let pre = 0;
return function (...args){
if (new Date() - pre > wait) {
// 當(dāng) n 秒內(nèi)不重復(fù)執(zhí)行
pre = new Date();
event.apply(this, args)
}
}
}

使用時(shí)間戳雖然能實(shí)現(xiàn)節(jié)流,但是最后一次事件不會(huì)執(zhí)行。

定時(shí)器

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

使用定時(shí)器實(shí)現(xiàn)節(jié)流,雖然最后一次能觸發(fā),但是第一次不會(huì)觸發(fā)。

時(shí)間戳 + 定時(shí)器。

為解決第一次和最后一次都可以觸發(fā),把兩者結(jié)合起來。

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)
}
}
}

節(jié)流場景

scroll 滾動(dòng)

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

input 動(dòng)態(tài)搜索

throttle(fetchInput, 300)

節(jié)流帝王庫

  • lodash-throttle。
  • underscore-throttle。

總結(jié)

防抖:只執(zhí)行最后一次。事件持續(xù)觸發(fā),但只有等事件停止觸發(fā)后 n 秒后才執(zhí)行函數(shù)。

節(jié)流:控制執(zhí)行頻率。持續(xù)觸發(fā),每 n 秒執(zhí)行一次函數(shù)。

對比圖:

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2021-05-08 07:53:33

面試線程池系統(tǒng)

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面試數(shù)據(jù)庫

2019-06-17 05:03:37

memcache內(nèi)核架構(gòu)

2023-12-18 07:37:17

JavaScript防抖節(jié)流

2020-04-30 10:24:35

Spring循環(huán)依賴Java

2020-04-16 08:22:11

HTTPS加解密協(xié)議

2021-05-20 08:54:16

Go面向對象

2010-08-23 15:06:52

發(fā)問

2022-05-24 08:03:28

InnoDBMySQL數(shù)據(jù)

2021-08-03 06:57:36

Js事件節(jié)流

2021-06-03 08:55:54

分布式事務(wù)ACID
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产成人综合亚洲欧美94在线 | 99精品99| 欧美成人影院 | 91久久综合亚洲鲁鲁五月天 | 日韩快播电影 | 国产一区免费 | 久久一区二区视频 | 中文字幕在线不卡 | 一区二区三区精品视频 | 久久精品视频一区二区 | 欧美日本一区二区 | 久久综合一区 | 在线一区 | 久久国产成人午夜av影院武则天 | 久久精品国产一区二区电影 | 国产精品视频999 | 99精品国产一区二区三区 | 成人在线免费观看 | 亚洲精品一区二区在线观看 | 亚洲69p | 麻豆91av| 久久久国产精品 | 亚洲精品v日韩精品 | 午夜精品久久久久久久久久久久久 | 一久久久 | 成人免费看片网 | 国产精品福利久久久 | 亚洲小视频在线观看 | 欧美精品1区2区3区 免费黄篇 | 国产成人在线一区二区 | 九九热在线免费视频 | 成人国产精品久久 | 国产精品毛片 | 美美女高清毛片视频免费观看 | 亚洲精品一区二区三区在线观看 | 久久精品一区二区 | 黄色免费在线观看网站 | 日韩免费一级 | aaa大片免费观看 | 亚洲成人精品一区二区 | 91看国产 |