摘要:節(jié)流在指定時間之內(nèi),讓函數(shù)只觸發(fā)一次。防抖對于一定時間段的連續(xù)的函數(shù)調(diào)用,只讓其執(zhí)行一次??偨Y(jié)以上只是很簡單的寫了一下節(jié)流和防抖的原理,在里,實(shí)現(xiàn)起來更加復(fù)雜,但是背后的原理核心就是上邊代碼寫的。
概述
在平時的開發(fā)中,經(jīng)常會聽到兩個差不多很相近的詞。節(jié)流(throttle)和防抖(debounce)。這是兩個類似又有些不同的優(yōu)化方案。
節(jié)流:在指定時間之內(nèi),讓函數(shù)只觸發(fā)一次。
防抖:對于一定時間段的連續(xù)的函數(shù)調(diào)用,只讓其執(zhí)行一次。
兩個方法在underscore.js中都已經(jīng)實(shí)現(xiàn)了。本文將會重點(diǎn)說明兩個函數(shù)的應(yīng)用場景和背后的原理。
應(yīng)用場景 節(jié)流throttle在英語里的意思是節(jié)流閥,顧名思義,設(shè)置一個閥值(制定一個時間),在這個閥值或者時間之內(nèi),函數(shù)只會執(zhí)行一次。
舉個例子,我們執(zhí)行頁面滾動的時候,比如在react里面,可能每次滾動都會觸發(fā)一次render,這樣嚴(yán)重影響性能,甚至?xí)斐蔀g覽器卡死。如果我們設(shè)置一個300ms的時間閥,那么在這段時間內(nèi),滾動時候只會觸發(fā)一次render.
同樣的,當(dāng)我們拖拽某個元素的時候,會每次判斷mousemove時跟位置相關(guān)的信息,每次都會執(zhí)行相關(guān)的計算和判斷,這種情況就和滾動時候一樣,如果設(shè)置一個時間閥,那么就可以避免由于大量執(zhí)行事件計算而造成的性能下降。
防抖我自己的理解,防抖的意思可以認(rèn)為是,阻止連續(xù)的抖動(所謂的事件觸發(fā)),也就是說,我們用防抖來讓那些連續(xù)觸發(fā)的事件只觸發(fā)一次。
比如,當(dāng)我們對一個文本框進(jìn)行輸入的時候,在react中,每次都會觸發(fā)onChange事件,我們可能在每次事件里發(fā)送ajax請求,判斷輸入的用戶名是否曾經(jīng)注冊過,這種情況下我們使用防抖,可以保證只會在最后一次onChange事件才會觸發(fā)ajax請求。
實(shí)現(xiàn)原理節(jié)流
節(jié)流實(shí)現(xiàn)起來很好理解,設(shè)置一個bool值,在時間閥之內(nèi),根據(jù)這個bool來判斷是否執(zhí)行函數(shù)。
function throttle(fn,times = 300){ let bool = true return function(){ if(!bool){ return false } bool = false setTimeout(()=>{ bool = true fn.apply(this,arguments) },times) } }
防抖
防抖實(shí)現(xiàn)起來的思路是,用閉包保存執(zhí)行的函數(shù),多次執(zhí)行的時候把上一個執(zhí)行的函數(shù)清除掉,然后再次創(chuàng)建一個新的函數(shù)。這樣在間隔時間內(nèi)還有事件觸發(fā)的話,不會執(zhí)行之前的函數(shù),這么一來,函數(shù)真正的執(zhí)行就是最后一次事件觸發(fā)。
function debounce(fn,times){ let timeout = null return function(){ clearTimeout(timeout) timeout = setTimeout(()=>{ fn.apply(this,arguments) },times) } }總結(jié)
以上只是很簡單的寫了一下節(jié)流和防抖的原理,在underscore.js里,實(shí)現(xiàn)起來更加復(fù)雜,但是背后的原理核心就是上邊代碼寫的。兩者都是在密集調(diào)用的過程中靈活使用setTimeout函數(shù)來對頻繁觸發(fā)的事件進(jìn)行控制和優(yōu)化。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/110127.html
摘要:函數(shù)節(jié)流和防抖防抖和節(jié)流的作用都是防止函數(shù)多次調(diào)用。頁面窗口的事件方法節(jié)流方法閉包節(jié)流防抖一段時間內(nèi)觸發(fā)事件只執(zhí)行一次。 js 函數(shù)節(jié)流和防抖 防抖和節(jié)流的作用都是防止函數(shù)多次調(diào)用。區(qū)別在于,假設(shè)一個用戶一直觸發(fā)這個函數(shù),且每次觸發(fā)函數(shù)的間隔小于wait,防抖的情況下只會調(diào)用一次,而節(jié)流的 情況會每隔一定時間(參數(shù)wait)調(diào)用函數(shù)。 throttle 節(jié)流 節(jié)流是將多次執(zhí)行變成每隔一...
摘要:文件為函數(shù)要傳入的參數(shù)返回事件處理函數(shù)添加事件監(jiān)聽節(jié)流函數(shù)一般用于事件的情況較多,因?yàn)檫@些事件的觸發(fā)是連續(xù)性的,需要在一個時間間隔內(nèi)只觸發(fā)一次。 showImg(https://segmentfault.com/img/remote/1460000018998747); 閱讀原文 前言 在前端開發(fā)當(dāng)中我們經(jīng)常會綁定一些事件觸發(fā)的某些程序執(zhí)行,有時這些事件會連續(xù)觸發(fā),如瀏覽器窗口 s...
摘要:所以針對此類事件則需要進(jìn)行節(jié)流,或者防抖動處理。節(jié)流判斷是否已空閑,如果在執(zhí)行中,則直接函數(shù)節(jié)流二防抖對于一定時間段內(nèi)的連續(xù)的函數(shù)調(diào)用,只執(zhí)行一次原理其實(shí)就是一個定時器,當(dāng)我們觸發(fā)一個事件時,讓這個事件延遲一會在執(zhí)行。 在瀏覽器dom事件里面,一些事件會隨著用戶的操作不間斷的觸發(fā),比如:為一個元素綁定拖拽事件,為頁面綁定resize事件(重新調(diào)整瀏覽器窗口大?。?,頁面滾動。如果dom操...
摘要:主要實(shí)現(xiàn)在于通過異步操作的事件間隔,對于前后兩次調(diào)用方法打時間進(jìn)行比較,用清空定時器的操作實(shí)現(xiàn)多余調(diào)用操作的舍棄。 廢話不多說,直奔主題。 什么是throttle和debounce? 這兩個方法的主要目的多是用于性能優(yōu)化。最常見的應(yīng)用嘗盡就是在通過監(jiān)聽resize、scroll、mouseover等事件時候的性能消耗。拿scroll來說,沒有處理時滑動一次滾動條scroll事件會觸發(fā)多...
摘要:主要實(shí)現(xiàn)在于通過異步操作的事件間隔,對于前后兩次調(diào)用方法打時間進(jìn)行比較,用清空定時器的操作實(shí)現(xiàn)多余調(diào)用操作的舍棄。 廢話不多說,直奔主題。 什么是throttle和debounce? 這兩個方法的主要目的多是用于性能優(yōu)化。最常見的應(yīng)用嘗盡就是在通過監(jiān)聽resize、scroll、mouseover等事件時候的性能消耗。拿scroll來說,沒有處理時滑動一次滾動條scroll事件會觸發(fā)多...
閱讀 2719·2021-11-11 16:55
閱讀 757·2021-09-04 16:40
閱讀 3142·2019-08-30 15:54
閱讀 2692·2019-08-30 15:54
閱讀 2475·2019-08-30 15:46
閱讀 456·2019-08-30 15:43
閱讀 3287·2019-08-30 11:11
閱讀 3042·2019-08-28 18:17