欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript中防抖和節(jié)流的原理和區(qū)別詳解

 更新時(shí)間:2023年09月18日 09:05:51   作者:念舊的俗人  
JavaScript 中,防抖和節(jié)流是一種用于優(yōu)化事件處理函數(shù)調(diào)用頻率的技術(shù),防抖和節(jié)流的目的都是為了避免頻繁地觸發(fā)事件處理函數(shù),從而減少瀏覽器和服務(wù)器的負(fù)擔(dān),本文將給大家介紹一下JavaScript中防抖和節(jié)流的原理和區(qū)別,需要的朋友可以參考下

前言

JavaScript 中,防抖和節(jié)流是一種用于優(yōu)化事件處理函數(shù)調(diào)用頻率的技術(shù)。防抖和節(jié)流的目的都是為了避免頻繁地觸發(fā)事件處理函數(shù),從而減少瀏覽器和服務(wù)器的負(fù)擔(dān)。

防抖

防抖(Debounce)的原理是在事件被觸發(fā)后,等待一定的時(shí)間間隔(比如500ms),如果在這個(gè)時(shí)間間隔內(nèi)沒(méi)有再次觸發(fā)該事件,才會(huì)執(zhí)行事件處理函數(shù)。如果在這個(gè)時(shí)間間隔內(nèi)又觸發(fā)了該事件,那么就重新等待新的時(shí)間間隔。

防抖主要是通過(guò)定時(shí)器來(lái)實(shí)現(xiàn),如下:

function debounce(fun, time) {
    let timer
    return function () {
        let that = this
        if (timer) clearTimeout(timer)
        timer = setTimeout(function () {
            fun.call(that)
        }, time)
    }
}

以上代碼中,fun 是事件處理程序,time 是事件執(zhí)行的延遲時(shí)間,單位:毫秒。每一次觸發(fā)事件時(shí),會(huì)先判斷一下 timer 的值是否賦值了定時(shí)器,如果賦值了,就直接清除定時(shí)器。然后在執(zhí)行下面的代碼。

節(jié)流

節(jié)流(Throttle)的原理是在事件被觸發(fā)后,首先執(zhí)行事件處理函數(shù),然后設(shè)置一個(gè)時(shí)間間隔(比如500ms),在這個(gè)時(shí)間間隔內(nèi)不再觸發(fā)該事件。只有等待這個(gè)時(shí)間間隔過(guò)去后,才會(huì)重新觸發(fā)事件,并再次執(zhí)行事件處理函數(shù)。

節(jié)流的實(shí)現(xiàn)方式有兩種:

  • 使用定時(shí)器實(shí)現(xiàn)
function throttlea(fun, t) {
    let timer = null
    return function () {
        let that = this
        if (!timer) {
            timer = setTimeout(function () {
                fun.call(that)
                timer = null
            }, t)
        }
    }
}

以上代碼中,觸發(fā)事件后,會(huì)直接重新賦值 timer 為一個(gè)定時(shí)器,到時(shí)間后執(zhí)行事件處理程序,重新賦值 timer 為 null,在這期間,因?yàn)?timer 的值是一個(gè)定時(shí)器,if 判斷是不會(huì)執(zhí)行的,必須重新賦值為 null 后才會(huì)重新執(zhí)行。

  • 時(shí)間戳的方式
function throttle(fun, time) {
    let start = 0
    return function () {
        let that = this
        let current = Date.now()
        if (current - start >= time) {
            fun.call(that)
            start = current
        }
    }
}

以上代碼中,觸發(fā)事件后,定義開(kāi)始觸發(fā)事件的時(shí)間 start 為零,獲取當(dāng)前的時(shí)間戳賦值給 current,判斷當(dāng)前時(shí)間與初始時(shí)間是否超過(guò)間隔,如果超過(guò)了就把當(dāng)前這個(gè)時(shí)間戳賦值給 start,然后執(zhí)行事件處理程序。(因?yàn)槌跏紩r(shí)間為零,所以第一次觸發(fā)會(huì)直接執(zhí)行)

總結(jié)

防抖:適用于需要等待用戶停止操作后再執(zhí)行的場(chǎng)景,比如搜索框輸入文本后請(qǐng)求接口。

節(jié)流:適用于需要限制函數(shù)執(zhí)行頻率的場(chǎng)景,比如滾動(dòng)事件中的懶加載。

到此這篇關(guān)于JavaScript中防抖和節(jié)流的原理和區(qū)別詳解的文章就介紹到這了,更多相關(guān)JavaScript防抖和節(jié)流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • js 設(shè)置css的定位

    js 設(shè)置css的定位

    css的定位設(shè)置代碼
    2008-12-12
  • JS獲取單擊按鈕單元格所在行的信息

    JS獲取單擊按鈕單元格所在行的信息

    這篇文章主要介紹了用JS獲取表格中單擊某個(gè)單元格中按鈕,得到所在行的信息,需要的朋友可以參考下
    2014-06-06
  • js正則表達(dá)式常用方法梳理(附代碼案例)

    js正則表達(dá)式常用方法梳理(附代碼案例)

    正則表達(dá)式在我們?nèi)粘痰墓ぷ黜?xiàng)目中,應(yīng)該是一個(gè)經(jīng)常用到的技能,在做一些字符的匹配和處理的過(guò)程中,發(fā)揮了很大的作用,這篇文章主要給大家介紹了關(guān)于js正則表達(dá)式常用方法的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • JavaScript操作表單實(shí)例講解(上)

    JavaScript操作表單實(shí)例講解(上)

    這篇文章主要介紹了JavaScript操作表單實(shí)例講解(上)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • js實(shí)現(xiàn)跨域訪問(wèn)的三種方法

    js實(shí)現(xiàn)跨域訪問(wèn)的三種方法

    這篇文章主要介紹了js實(shí)現(xiàn)跨域訪問(wèn)的三種方法,包括基于iframe實(shí)現(xiàn)跨域、基于script標(biāo)簽實(shí)現(xiàn)跨域以及后臺(tái)代理方式 ,感興趣的小伙伴們可以參考一下
    2015-12-12
  • JavaScript各類型的關(guān)系圖解

    JavaScript各類型的關(guān)系圖解

    這篇文章主要通過(guò)一張圖讓你看懂JavaScript各類型的關(guān)系,需要的朋友可以參考下
    2015-10-10
  • js仿360開(kāi)機(jī)效果

    js仿360開(kāi)機(jī)效果

    這篇文章主要為大家詳細(xì)介紹了js仿360開(kāi)機(jī)效果,并且封裝一個(gè)帶回調(diào)函數(shù)的緩動(dòng)動(dòng)畫(huà),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • H5圖片壓縮與上傳實(shí)例

    H5圖片壓縮與上傳實(shí)例

    這篇文章主要為大家詳細(xì)介紹了H5圖片壓縮與上傳的實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • JS實(shí)現(xiàn)課堂隨機(jī)點(diǎn)名和順序點(diǎn)名

    JS實(shí)現(xiàn)課堂隨機(jī)點(diǎn)名和順序點(diǎn)名

    這篇文章主要介紹了基于JS實(shí)現(xiàn)課堂隨機(jī)點(diǎn)名和順序點(diǎn)名的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下
    2017-03-03
  • javascript實(shí)現(xiàn)可改變滾動(dòng)方向的無(wú)縫滾動(dòng)實(shí)例

    javascript實(shí)現(xiàn)可改變滾動(dòng)方向的無(wú)縫滾動(dòng)實(shí)例

    無(wú)縫滾動(dòng)在制作一些圖片展示的時(shí)候還是蠻有用的,下面與大家分享下javascript實(shí)現(xiàn)的可改變滾動(dòng)方向的無(wú)縫滾動(dòng),具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下哈
    2013-06-06

最新評(píng)論