摘要:一什么是節(jié)流節(jié)流函數(shù)就是讓事件處理函數(shù)在大于等于執(zhí)行周期時(shí)才能執(zhí)行,周期之內(nèi)不執(zhí)行,即事件一直被觸發(fā),那么事件將會(huì)按每小段固定時(shí)間一次的頻率執(zhí)行。我們通過(guò)一個(gè)簡(jiǎn)單的示意來(lái)理解節(jié)流函數(shù)可以用時(shí)間戳和定時(shí)器兩種方式進(jìn)行處理。
本文共 2000 字,讀完只需 8 分鐘
上一篇文章講了去抖函數(shù),然后這一篇講同樣為了優(yōu)化性能,降低事件處理頻率的節(jié)流函數(shù)。
節(jié)流函數(shù)(throttle)就是讓事件處理函數(shù)(handler)在大于等于執(zhí)行周期時(shí)才能執(zhí)行,周期之內(nèi)不執(zhí)行,即事件一直被觸發(fā),那么事件將會(huì)按每小段固定時(shí)間一次的頻率執(zhí)行。
打個(gè)比方:王者榮耀、英雄聯(lián)盟、植物大戰(zhàn)僵尸游戲中,技能的冷卻時(shí)間,技能的冷卻過(guò)程中,是無(wú)法使用技能的,只能等冷卻時(shí)間到之后才能執(zhí)行。
那什么樣的場(chǎng)景能用到節(jié)流函數(shù)呢?
比如:
頁(yè)面滾動(dòng)和改變大小時(shí)需要進(jìn)行業(yè)務(wù)處理,比如判斷是否滑到底部,然后進(jìn)行懶加載數(shù)據(jù)。
按鈕被高頻率地點(diǎn)擊時(shí),比如游戲和搶購(gòu)網(wǎng)站。
我們通過(guò)一個(gè)簡(jiǎn)單的示意來(lái)理解:
節(jié)流函數(shù)可以用時(shí)間戳和定時(shí)器兩種方式進(jìn)行處理。
二、時(shí)間戳方式實(shí)現(xiàn)正在滑動(dòng):0
看時(shí)間戳實(shí)現(xiàn)版本的效果:
正在滑動(dòng): 0
看看定時(shí)器版實(shí)現(xiàn)版本的效果:
對(duì)比時(shí)間戳和定時(shí)器兩種方式,效果上的區(qū)別主要在于:
事件戳方式會(huì)立即執(zhí)行,定時(shí)器會(huì)在事件觸發(fā)后延遲執(zhí)行,而且事件停止觸發(fā)后還會(huì)再延遲執(zhí)行一次。
具體選擇哪種方式取決于使用場(chǎng)景。underscore 把這兩類(lèi)場(chǎng)景用 leading 和 trailing 進(jìn)行了表示。
四、兼容兩種方式, underscore 源碼實(shí)現(xiàn)underscore 的源碼中就同時(shí)實(shí)現(xiàn)了時(shí)間戳和定時(shí)器實(shí)現(xiàn)方式,在調(diào)用時(shí)可以自由選擇要不要在間隔時(shí)間開(kāi)始時(shí)(leading)執(zhí)行,或是間隔時(shí)間結(jié)束后(trailing)執(zhí)行。
具體看偽代碼和示意圖:
正在滑動(dòng): 0
下面是我畫(huà)的示意圖:
大致總結(jié)一下代碼對(duì)事件處理邏輯的影響:
如果 leading 為真,那么綠色意味著間隔時(shí)間的開(kāi)始會(huì)立即執(zhí)行,第一次觸發(fā)也會(huì)立即執(zhí)行。
如果 trailing 為真,那么從藍(lán)紫色的豎細(xì)線后的剩余事件,會(huì)跑一個(gè)定時(shí)器,定時(shí)器在時(shí)間間隔結(jié)束時(shí)再執(zhí)行一次事件處理函數(shù)。
如果 leading 不為真,那么第一次事件觸發(fā)不會(huì)立即執(zhí)行。
如果 trailing 不為真,最后一次事件觸發(fā)后,不然再執(zhí)行一次事件處理函數(shù)。
節(jié)流和去抖的常見(jiàn)場(chǎng)景
輸入框打字輸入完后才開(kāi)始異步請(qǐng)求數(shù)據(jù)校驗(yàn)內(nèi)容:去抖
下拉滾動(dòng)條判斷是否到底部,進(jìn)行懶加載數(shù)據(jù):去抖和節(jié)流都可以,判斷是否到底的方式不同
活動(dòng)網(wǎng)站、游戲網(wǎng)站,按鈕被瘋狂點(diǎn)擊:節(jié)流
六、總結(jié)去抖和節(jié)流函數(shù)都是為了降低高頻率事件觸發(fā)的事件處理頻率,從而優(yōu)化網(wǎng)頁(yè)中大量重繪重排帶來(lái)的性能問(wèn)題。
其區(qū)別在于去抖會(huì)在高頻率事件觸發(fā)時(shí),只執(zhí)行一次,節(jié)流會(huì)在滿足間隔時(shí)間后執(zhí)行一次。去抖的 immediate,節(jié)流中的 leading, trailing 都是為了盡可能滿足這類(lèi)工具函數(shù)的不同使用場(chǎng)景。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/99956.html
摘要:如果本次定時(shí)器沒(méi)有被清除,時(shí)間到后就會(huì)自然執(zhí)行事件處理函數(shù)。綁定去抖后的事件回調(diào)函數(shù)綁定回調(diào)函數(shù)的屬性方法,點(diǎn)擊頁(yè)面,重置去抖效果異步請(qǐng)求清空上一次事件觸發(fā)的定時(shí)器重置為從而下一次事件觸發(fā)就能立即執(zhí)行。 一、前言 為什么會(huì)有去抖和節(jié)流這類(lèi)工具函數(shù)? 在用戶和前端頁(yè)面的交互過(guò)程中,很多操作的觸發(fā)頻率非常高,比如鼠標(biāo)移動(dòng) mousemove 事件, 滾動(dòng)條滑動(dòng) scroll 事件, 輸...
摘要:寫(xiě)在前面專(zhuān)題系列是我寫(xiě)的第二個(gè)系列,第一個(gè)系列是深入系列。專(zhuān)題系列自月日發(fā)布第一篇文章,到月日發(fā)布最后一篇,感謝各位朋友的收藏點(diǎn)贊,鼓勵(lì)指正。 寫(xiě)在前面 JavaScript 專(zhuān)題系列是我寫(xiě)的第二個(gè)系列,第一個(gè)系列是 JavaScript 深入系列。 JavaScript 專(zhuān)題系列共計(jì) 20 篇,主要研究日常開(kāi)發(fā)中一些功能點(diǎn)的實(shí)現(xiàn),比如防抖、節(jié)流、去重、類(lèi)型判斷、拷貝、最值、扁平、柯里...
摘要:關(guān)于節(jié)流的實(shí)現(xiàn),有兩種主流的實(shí)現(xiàn)方式,一種是使用時(shí)間戳,一種是設(shè)置定時(shí)器。當(dāng)觸發(fā)事件的時(shí)候,我們?cè)O(shè)置一個(gè)定時(shí)器,再觸發(fā)事件的時(shí)候,如果定時(shí)器存在,就不執(zhí)行,直到定時(shí)器執(zhí)行,然后執(zhí)行函數(shù),清空定時(shí)器,這樣就可以設(shè)置下個(gè)定時(shí)器。 JavaScript 專(zhuān)題系列第二篇,講解節(jié)流,帶你從零實(shí)現(xiàn)一個(gè) underscore 的 throttle 函數(shù) 前言 在《JavaScript專(zhuān)題之跟著und...
摘要:專(zhuān)題系列共計(jì)篇,主要研究日常開(kāi)發(fā)中一些功能點(diǎn)的實(shí)現(xiàn),比如防抖節(jié)流去重類(lèi)型判斷拷貝最值扁平柯里遞歸亂序排序等,特點(diǎn)是研究專(zhuān)題之函數(shù)組合專(zhuān)題系列第十六篇,講解函數(shù)組合,并且使用柯里化和函數(shù)組合實(shí)現(xiàn)模式需求我們需要寫(xiě)一個(gè)函數(shù),輸入,返回。 JavaScript 專(zhuān)題之從零實(shí)現(xiàn) jQuery 的 extend JavaScritp 專(zhuān)題系列第七篇,講解如何從零實(shí)現(xiàn)一個(gè) jQuery 的 ext...
閱讀 1016·2021-09-26 09:55
閱讀 3556·2021-09-24 10:30
閱讀 1364·2021-09-08 09:36
閱讀 2553·2021-09-07 09:58
閱讀 603·2019-08-30 15:56
閱讀 765·2019-08-29 18:32
閱讀 3594·2019-08-29 15:13
閱讀 1840·2019-08-29 13:49