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

前端百題斬—通俗易懂的防抖與節流

開發 前端
防抖就是將多次高頻操作優化為只在最后一次執行(某個函數在某段時間內,無論觸發了多少次回調,都只執行最后一次)。通常的使用場景是:用戶輸入,只需在輸入完成后做一次輸入校驗即可。

[[435872]]

性能一直是前端老生常談的一個話題,其中有一個性能問題就是我們會頻繁的觸發一些事件,例如mousemove、scroll、resize等,雖然瀏覽器已經對這些事件的觸發做了一些優化,但是如果在很短的時間內頻繁的觸發仍然會影響性能,這個時候就需要今天的主角:防抖和節流,利用它們來進行優化,提高性能。

1 防抖

1.1 定義

防抖就是將多次高頻操作優化為只在最后一次執行(某個函數在某段時間內,無論觸發了多少次回調,都只執行最后一次)。通常的使用場景是:用戶輸入,只需在輸入完成后做一次輸入校驗即可。

1.2 實現

防抖是將多次操作合并為一次操作完成,其原理就是維護一個計時器,在規定的時間后觸發函數,但是在該規定時間內再次觸發的話就會取消之前的定時器而重新設置,從而保證了只有最后一次操作能夠被觸發。其實現步驟如下所示:

  1. 利用閉包保存一個timer變量,然后返回一個函數(這個返回的函數就是后續頻繁觸發操作中調用的函數);
  2. 根據標志位判斷是否第一次需要立即執行(因為有些情況是需要首次調用函數立即執行的,若沒有該參數,就會在定時器到了之后才會執行);
  3. 當有新的觸發時,若存在定時器,則清空該定時器;
  4. 設定一個新的定時器,重新計時。
  1. function debounce(fn, wait, immediate) { 
  2.         let timer = null
  3.         return function (...args) { 
  4.             // 立即執行的功能(timer為空表示首次觸發) 
  5.             if (immediate && !timer) { 
  6.                 fn.apply(this, args); 
  7.             } 
  8.  
  9.             // 有新的觸發,則把定時器清空 
  10.             timer && clearTimeout(timer); 
  11.             // 重新計時 
  12.             timer = setTimeout(() => { 
  13.                 fn.apply(this, args); 
  14.             }, wait); 
  15.         } 
  16.     } 

1.3 效果預覽

圖片

觀察效果圖可以驗證上述的理論知識:

  1. 防抖之后輸出內容的頻次降低了;
  2. 防抖之后,其在超過一定時間之后才會輸出內容。

2 節流

2.1 定義

節流就是每隔一段時間后執行一次,也就是降低頻率,將高頻操作優化成低頻操作。通常使用場景:滾動條事件、resize事件、動畫等,通常每隔100-500ms執行一次即可。

2.2 實現

節流函數的實現方式有兩種:定時器版本、時間戳版本,這兩者各有千秋,下面來簡要實現一下。

2.2.1 定時器版本

定時器版本的節流函數其重點是利用閉包保存timer變量,具有兩個特點:

  1. n秒后才會執行第一次(定時器到了時間后才會觸發);
  2. 停止觸發后節流函數還會執行一次(因為該函數是延遲執行的,當停止觸發時其任務已經到了隊列中,所以停止后還會執行一次)。
  1. // 定時器版本 
  2. function throttle(fn, wait) { 
  3.     let timer = null
  4.     return function(...args) { 
  5.         if (!timer) { 
  6.             timer = setTimeout(() => { 
  7.                 fn.apply(this, args); 
  8.                 timer = null
  9.             }, wait) 
  10.         } 
  11.     } 

2.2.2 時間戳版本

時間戳版本的節流函數重點是利用閉包保存上一次的時間previous,具有兩個特點:

開始觸發后會立即執行(因為previous開始會被賦值為0);

停止觸發后不再執行(因為該函數是同步任務,在觸發的時候就會進行相應的判斷,所以就不存在停止觸發后再執行的情況)。

  1. // 時間戳版本 
  2. function throttle(fn, wait) { 
  3.     // 上一次執行時間 
  4.     let previous = 0; 
  5.     return function(...args) { 
  6.         // 當前時間 
  7.         let now = +new Date(); 
  8.         if (now - previous > wait) { 
  9.             previous = now; 
  10.             fn.apply(this, args); 
  11.         } 
  12.     } 

2.3 效果預覽

觀察效果圖可以驗證上述的理論知識:

  1. 節流確實降低了內容的輸出頻率,將高頻變為低頻;
  2. 時間戳版本的節流函數在首次會輸出內容,但是最后一次的內容不會輸出(謹慎使用);
  3. 定時器版本的節流函數確實不會立刻打印內容,而是超過一定時間之后才會打印;此外,其最后輸入的內容會被打印出來。

 

責任編輯:姜華 來源: 前端點線面
相關推薦

2021-05-30 19:02:59

變量對象上下文

2021-05-27 07:02:05

JavaScript代碼設施

2011-10-26 19:57:33

2019-06-19 08:30:47

網絡協議IPTCP

2023-01-06 09:40:20

項目性能

2020-06-08 10:50:58

前端TypeScript代碼

2021-05-26 16:12:20

區塊鏈加密貨幣比特幣

2022-06-28 07:31:11

哨兵模式redis

2022-09-23 08:32:53

微服務架構服務

2024-10-12 09:33:24

消息隊列多線程并行編程

2021-08-03 06:57:36

Js事件節流

2021-11-04 08:16:50

MySQL SQL 語句數據庫

2022-07-06 08:17:50

C 語言函數選型

2021-10-19 22:23:05

typeof方式Instanceof

2021-05-09 22:00:59

TypeofInstanceof運算符

2019-05-20 07:37:00

TCPIP網絡協議

2018-01-17 22:36:46

區塊鏈數字貨幣比特幣

2018-03-05 08:49:44

物聯網云計算云技術

2023-12-18 07:37:17

JavaScript防抖節流

2021-05-25 09:50:01

GitLinux命令
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 羞羞色网站 | 中文字幕一二三区 | 久久久精品久久久 | 国产一区二区在线免费观看 | 国产成人精品一区二 | 亚洲一区二区三区在线播放 | xxx国产精品视频 | 999免费视频 | 日韩精品一区二区三区视频播放 | 亚洲欧美国产精品久久 | 久久久久成人精品免费播放动漫 | 涩涩视频网站在线观看 | 国产粉嫩尤物极品99综合精品 | 亚洲一区电影 | 视频三区 | 欧美一区二区在线播放 | 成人午夜性成交 | 国产精品久久久久久久 | 精品亚洲一区二区三区 | 伊人焦久影院 | 欧美一区精品 | 欧美成人免费在线视频 | 久久精品国产一区二区电影 | 99免费视频| 91爱啪啪| 亚洲精品视频免费观看 | 1区2区3区视频 | 国产一区二区精品在线 | 欧美成人免费电影 | 国产一区二区久久久 | 日本人做爰大片免费观看一老师 | 九九热在线视频观看这里只有精品 | 国产精品久久久久久久免费大片 | 中文字幕一区二区三区在线视频 | 成在线人视频免费视频 | 日批免费看 | 亚洲综合大片69999 | 国产精品激情小视频 | 国产二区精品视频 | 久久久久精 | 国产在线a |