最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript函數(shù)防抖示例詳解

 更新時(shí)間:2025年09月06日 10:09:53   作者:MadeInSQL  
函數(shù)防抖是一種常見的前端性能優(yōu)化手段,尤其適用于處理那些高頻觸發(fā)的事件,例如窗口的resize、頁面的scroll、輸入框的鍵盤輸入等,這篇文章主要介紹了JavaScript函數(shù)防抖的相關(guān)資料,需要的朋友可以參考下

前言

函數(shù)防抖(Debounce)是JavaScript中一種常用的性能優(yōu)化技術(shù),主要用于控制函數(shù)執(zhí)行的頻率。

什么是函數(shù)防抖?

函數(shù)防抖是指在一定時(shí)間間隔內(nèi),如果事件被連續(xù)觸發(fā),則只執(zhí)行最后一次觸發(fā)的事件處理函數(shù)。簡(jiǎn)單來說,就是讓一個(gè)函數(shù)在一定時(shí)間內(nèi)只執(zhí)行一次。

實(shí)現(xiàn)原理

函數(shù)防抖的核心原理是使用定時(shí)器(setTimeout)來延遲函數(shù)的執(zhí)行:

  1. 當(dāng)事件觸發(fā)時(shí),清除之前的定時(shí)器
  2. 設(shè)置一個(gè)新的定時(shí)器
  3. 如果在定時(shí)器到期前事件再次被觸發(fā),則重復(fù)上述過程
  4. 只有當(dāng)事件停止觸發(fā)一段時(shí)間后,函數(shù)才會(huì)真正執(zhí)行

應(yīng)用場(chǎng)景

  1. 搜索框輸入聯(lián)想(避免每次輸入都發(fā)送請(qǐng)求)
  2. 窗口大小調(diào)整事件
  3. 滾動(dòng)事件處理
  4. 表單驗(yàn)證(在用戶停止輸入后進(jìn)行驗(yàn)證)

基礎(chǔ)實(shí)現(xiàn)

function debounce(func, delay) {
  let timer = null;
  return function() {
    const context = this;
    const args = arguments;
    clearTimeout(timer);
    timer = setTimeout(() => {
      func.apply(context, args);
    }, delay);
  };
}

這是一個(gè)基本的防抖函數(shù)實(shí)現(xiàn),接收要執(zhí)行的函數(shù)和延遲時(shí)間作為參數(shù)。

進(jìn)階實(shí)現(xiàn)(立即執(zhí)行版本)

 debounce(func, delay, immediate) {
  let timer = null;
  return function() {
    const context = this;
    const args = arguments;
    
    if (timer) clearTimeout(timer);
    
    if (immediate) {
      const callNow = !timer;
      timer = setTimeout(() => {
        timer = null;
      }, delay);
      if (callNow) func.apply(context, args);
    } else {
      timer = setTimeout(() => {
        func.apply(context, args);
      }, delay);
    }
  };
}

這個(gè)版本增加了立即執(zhí)行選項(xiàng),第一次觸發(fā)會(huì)立即執(zhí)行函數(shù)。

使用示例

// 搜索框輸入防抖
const searchInput = document.getElementById('search');
const searchHandler = debounce(function() {
  console.log('搜索:', this.value);
  // 這里可以添加實(shí)際的搜索邏輯
}, 500);

searchInput.addEventListener('input', searchHandler);

// 窗口大小調(diào)整防抖
const resizeHandler = debounce(function() {
  console.log('窗口大小已調(diào)整');
}, 200);

window.addEventListener('resize', resizeHandler);

注意事項(xiàng)

  1. 防抖時(shí)間間隔需要根據(jù)實(shí)際場(chǎng)景合理設(shè)置
  2. 對(duì)于需要立即反饋的操作(如按鈕點(diǎn)擊),不適合使用防抖
  3. 防抖函數(shù)會(huì)延遲執(zhí)行,可能導(dǎo)致用戶體驗(yàn)上的延遲感

函數(shù)防抖是前端性能優(yōu)化的重要手段,合理使用可以顯著提升頁面性能。

函數(shù)防抖和函數(shù)節(jié)流有什么區(qū)別?

函數(shù)防抖(Debounce)和函數(shù)節(jié)流(Throttle)是前端開發(fā)中兩種常用的性能優(yōu)化技術(shù),用于控制高頻觸發(fā)事件的執(zhí)行頻率。雖然兩者都旨在減少函數(shù)執(zhí)行次數(shù),但它們的實(shí)現(xiàn)邏輯和適用場(chǎng)景有顯著區(qū)別。以下是兩者的詳細(xì)對(duì)比與分析:

‌一、核心區(qū)別對(duì)比‌

維度函數(shù)防抖(Debounce)函數(shù)節(jié)流(Throttle)
核心邏輯延遲執(zhí)行‌:事件觸發(fā)后等待一段時(shí)間,若期間無新觸發(fā)則執(zhí)行;若有新觸發(fā)則重新計(jì)時(shí)。固定間隔執(zhí)行‌:無論事件觸發(fā)頻率如何,每隔固定時(shí)間必定執(zhí)行一次。
執(zhí)行時(shí)機(jī)僅在最后一次觸發(fā)后的延遲時(shí)間結(jié)束后執(zhí)行。在固定時(shí)間間隔內(nèi)至少執(zhí)行一次,可能多次觸發(fā)但只執(zhí)行一次。
適用場(chǎng)景搜索框輸入、窗口調(diào)整結(jié)束、防重復(fù)提交等需要“等待穩(wěn)定”的場(chǎng)景。滾動(dòng)事件、鼠標(biāo)移動(dòng)、動(dòng)畫幀等需要“持續(xù)響應(yīng)”的場(chǎng)景。
延遲感存在明顯延遲(用戶操作停止后等待執(zhí)行)。響應(yīng)更及時(shí)(固定間隔內(nèi)至少執(zhí)行一次)。

‌二、實(shí)現(xiàn)原理對(duì)比‌

‌1. 函數(shù)防抖的實(shí)現(xiàn)邏輯‌

  • 關(guān)鍵點(diǎn)‌:通過 setTimeout 延遲執(zhí)行,并在每次觸發(fā)時(shí)清除之前的定時(shí)器。
  • 示例代碼‌:
    function debounce(func, delay) {
      let timer = null;
      return function() {
        clearTimeout(timer);
        timer = setTimeout(() => {
          func.apply(this, arguments);
        }, delay);
      };
    }
    
  • 類比‌:
    想象你正在等待電梯,如果有人按下按鈕后,電梯到達(dá)前又有人按了按鈕,電梯會(huì)取消之前的指令,重新開始倒計(jì)時(shí)。只有當(dāng)電梯等待時(shí)間結(jié)束后,才會(huì)真正運(yùn)行。

‌2. 函數(shù)節(jié)流的實(shí)現(xiàn)邏輯‌

  • 關(guān)鍵點(diǎn)‌:通過時(shí)間戳或標(biāo)志位記錄上次執(zhí)行時(shí)間,確保在固定間隔內(nèi)最多執(zhí)行一次。
  • 示例代碼(時(shí)間戳版)‌:
    function throttle(func, interval) {
      let lastTime = 0;
      return function() {
        const now = Date.now();
        if (now - lastTime >= interval) {
          func.apply(this, arguments);
          lastTime = now;
        }
      };
    }
    
  • 類比‌:
    想象你正在接水,水龍頭每秒只能放一次水。無論你多么頻繁地打開水龍頭,水只會(huì)以固定的時(shí)間間隔流出。

‌三、適用場(chǎng)景對(duì)比‌

‌1. 函數(shù)防抖的適用場(chǎng)景‌

  • 搜索框輸入聯(lián)想‌:
    用戶輸入時(shí),等待用戶停止輸入后再發(fā)送請(qǐng)求(如等待 300ms 后搜索),避免每次輸入都觸發(fā)請(qǐng)求。
  • 窗口調(diào)整結(jié)束‌:
    監(jiān)聽 resize 事件時(shí),等待用戶停止拖動(dòng)窗口后再調(diào)整布局。
  • 防重復(fù)提交‌:
    防止用戶快速點(diǎn)擊按鈕多次提交表單。

‌2. 函數(shù)節(jié)流的適用場(chǎng)景‌

  • 滾動(dòng)事件處理‌:
    監(jiān)聽 scroll 事件時(shí),無論用戶滾動(dòng)多快,每 200ms 最多執(zhí)行一次滾動(dòng)邏輯(如懶加載、返回頂部按鈕顯示)。
  • 鼠標(biāo)移動(dòng)事件‌:
    游戲開發(fā)中,限制鼠標(biāo)移動(dòng)事件的觸發(fā)頻率,避免性能問題。
  • 動(dòng)畫幀控制‌:
    通過 requestAnimationFrame 節(jié)流,確保動(dòng)畫幀率穩(wěn)定。

‌四、實(shí)際案例對(duì)比‌

‌1. 搜索框輸入‌

  • 防抖‌:
    用戶輸入 "hello" 時(shí),若每 100ms 輸入一個(gè)字母,防抖會(huì)等待 300ms 后才發(fā)送 "hello" 的請(qǐng)求。
  • 節(jié)流‌:
    用戶輸入 "hello" 時(shí),若每 100ms 輸入一個(gè)字母,節(jié)流可能只發(fā)送 "h"、"he"、"hel" 等部分請(qǐng)求(取決于間隔設(shè)置),導(dǎo)致搜索結(jié)果不準(zhǔn)確。

‌2. 滾動(dòng)加載‌

  • 防抖‌:
    用戶快速滾動(dòng)頁面時(shí),防抖會(huì)等待滾動(dòng)停止后才加載數(shù)據(jù),導(dǎo)致用戶看到空白區(qū)域。
  • 節(jié)流‌:
    用戶快速滾動(dòng)頁面時(shí),節(jié)流會(huì)每隔固定時(shí)間加載一次數(shù)據(jù),確保頁面內(nèi)容持續(xù)更新。

‌五、優(yōu)缺點(diǎn)對(duì)比‌

技術(shù)優(yōu)點(diǎn)缺點(diǎn)
防抖- 避免高頻執(zhí)行,減少資源消耗。
- 適用于需要“等待穩(wěn)定”的場(chǎng)景。
- 存在延遲,用戶體驗(yàn)可能不流暢(如搜索框輸入后需等待)。
節(jié)流- 確保固定間隔內(nèi)至少執(zhí)行一次,響應(yīng)更及時(shí)。
- 適用于需要“持續(xù)響應(yīng)”的場(chǎng)景。
- 無法完全避免高頻執(zhí)行(如用戶滾動(dòng)極快時(shí)仍可能多次觸發(fā))。

‌六、如何選擇?‌

  1. 需要“等待穩(wěn)定”的場(chǎng)景‌ → ‌防抖
    • 用戶操作完成后才執(zhí)行(如搜索框輸入、窗口調(diào)整結(jié)束)。
  2. 需要“持續(xù)響應(yīng)”的場(chǎng)景‌ → ‌節(jié)流
    • 用戶操作過程中需要持續(xù)反饋(如滾動(dòng)加載、鼠標(biāo)移動(dòng))。
  3. 組合使用
    • 某些場(chǎng)景可能需要同時(shí)使用防抖和節(jié)流(如既要在滾動(dòng)停止后加載數(shù)據(jù),又要在滾動(dòng)過程中限制頻率)。

‌七、代碼示例對(duì)比‌

‌1. 防抖示例:搜索框輸入‌

const searchInput = document.getElementById('search');
const debouncedSearch = debounce(() => {
  console.log('執(zhí)行搜索:', searchInput.value);
}, 300);

searchInput.addEventListener('input', debouncedSearch);

‌2. 節(jié)流示例:滾動(dòng)加載‌

window.addEventListener('scroll', throttle(() => {
  console.log('檢查滾動(dòng)位置,加載數(shù)據(jù)');
  // 懶加載邏輯
}, 200));

‌總結(jié)‌

  • 函數(shù)防抖‌:適合“等待用戶操作完成”的場(chǎng)景,通過延遲執(zhí)行減少不必要的計(jì)算。
  • 函數(shù)節(jié)流‌:適合“需要持續(xù)響應(yīng)”的場(chǎng)景,通過固定間隔執(zhí)行確保流暢的用戶體驗(yàn)。

根據(jù)實(shí)際需求選擇合適的技術(shù),可以顯著提升頁面性能和用戶體驗(yàn)。

到此這篇關(guān)于JavaScript函數(shù)防抖的文章就介紹到這了,更多相關(guān)JS函數(shù)防抖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Bootstrap3多級(jí)下拉菜單

    Bootstrap3多級(jí)下拉菜單

    這篇文章主要為大家詳細(xì)介紹了Bootstrap3多級(jí)下拉菜單的相關(guān)資料,需引用bootstrap.min.css和bootstrap.min.css.js,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • HTML中使背景圖片自適應(yīng)瀏覽器大小實(shí)例詳解

    HTML中使背景圖片自適應(yīng)瀏覽器大小實(shí)例詳解

    這篇文章主要介紹了HTML中使背景圖片自適應(yīng)瀏覽器大小實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • layerui代碼控制tab選項(xiàng)卡,添加,關(guān)閉的實(shí)例

    layerui代碼控制tab選項(xiàng)卡,添加,關(guān)閉的實(shí)例

    今天小編就為大家分享一篇layerui代碼控制tab選項(xiàng)卡,添加,關(guān)閉的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • 關(guān)于JavaScript使用export和import的兩個(gè)報(bào)錯(cuò)解決

    關(guān)于JavaScript使用export和import的兩個(gè)報(bào)錯(cuò)解決

    說來慚愧es6寫了這么久,連最基本的export和import都沒搞明白,下面這篇文章主要給大家介紹了關(guān)于JavaScript使用export和import的兩個(gè)報(bào)錯(cuò)的解決方法,需要的朋友可以參考下
    2022-07-07
  • js COL能很好的控制表格的列

    js COL能很好的控制表格的列

    由于沒有用循環(huán),所以,速度要相對(duì)快些.但是IE下,明顯示不如FF下好用.
    2008-04-04
  • Webpack5 多頁面的項(xiàng)目實(shí)踐

    Webpack5 多頁面的項(xiàng)目實(shí)踐

    本文主要介紹了Webpack5 多頁面的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-07-07
  • 詳解JS轉(zhuǎn)換數(shù)值函數(shù)Number()、parseInt()、parseFloat()

    詳解JS轉(zhuǎn)換數(shù)值函數(shù)Number()、parseInt()、parseFloat()

    JS中有三種函數(shù)可以將非數(shù)值轉(zhuǎn)換成數(shù)值:Number()、parseInt()和parseFloat()。接下來通過本文詳細(xì)的給大家介紹JS轉(zhuǎn)換數(shù)值函數(shù)Number()、parseInt()、parseFloat()的實(shí)例代碼,感興趣的朋友一起看看吧
    2018-08-08
  • JavaScript倒計(jì)時(shí)定時(shí)器和間隔定時(shí)器使用詳解

    JavaScript倒計(jì)時(shí)定時(shí)器和間隔定時(shí)器使用詳解

    這篇文章主要為大家介紹了JavaScript倒計(jì)時(shí)定時(shí)器和間隔定時(shí)器使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2023-05-05
  • 最新評(píng)論

    乐业县| 会理县| 博爱县| 承德县| 峡江县| 宝鸡市| 大姚县| 宁陕县| 西昌市| 宁乡县| 宝应县| 祁连县| 紫云| 巴楚县| 广汉市| 马山县| 化州市| 宝应县| 布尔津县| 科技| 米脂县| 保山市| 夏邑县| 七台河市| 嘉定区| 宁夏| 息烽县| 绥芬河市| 甘谷县| 上饶县| 太谷县| 陆川县| 富川| 中牟县| 南木林县| 汝南县| 临潭县| 双辽市| 武鸣县| 莎车县| 镶黄旗|