JavaScript 函數節流 throttle 和防抖 debounce

今天和別人聊到JavaScript函數的節流和防抖,發現自己對這兩個的區別很是模糊,遂小小實踐一下,在此記錄,希望對需要的人有所幫助。

節流 - 頻繁操作,間隔一定時間去做一件事

舉例說明:假定時間間隔為 500ms,頻繁不停的操作 2s,且每兩次執行時間小于等于時間間隔 500ms,那么就會執行 4 次,也就是每隔 時間間隔 500ms 執行一次。

防抖 - 頻繁操作,一定時間間隔內只執行最后一次操作

舉例說明:假定時間間隔是 500ms,頻繁不停的操作 5s,且每兩次執行時間小于等于時間間隔 500ms,那么最后只執行了 1 次,也就是每一次執行時都結束了上一次的執行。

代碼示例

    //節流方法 1function throttle1(method, duration){var prevTime = new Date();return function () {var context = this,currentTime = new Date(),resTime = currentTime - prevTime;//打印出本次調用方法和上次執行方法的時間差console.log("時間差"+resTime);//當本次調用距離上次執行方法的時間差大于等于要求時間間隔時,執行一次方法if(resTime >= duration){method.apply(context);//記錄執行方法的時間prevTime = currentTime;}}}//節流方法 2function throttle2(method, duration){//當前時間間隔內是否有方法在執行(或者說方法的調用是否在進行)var runningFlag = false;return function (e) {// 判斷當前是否有方法在執行,有,則什么都不做if (runningFlag) {return false;}//開始執行runningFlag = true;setTimeout(function(){method(e);//執行完畢,聲明當前沒有正在執行的方法,方便下一個時間間隔內的調用runningFlag = false;}, duration)}}//防抖function debounce(method, duration){var timer = null;return function(){var context = this,args = arguments;//在本次調用之前的一個間隔時間內,有方法在執行,則終止該方法的執行if(timer){clearTimeout(timer);}//開始執行本次調用timer = setTimeout(function(){method.apply(context, args);},duration);}}//模擬三個執行方法function jieliu1(){console.log("節流 1");}function jieliu2(){console.log("節流 2");}function fangdou(){console.log("防抖");}//持續執行時間var totalTime = 2000;var jieliuFn1 = throttle1(jieliu1,500);var jieliuFn2 = throttle2(jieliu2,500);var fangdouFn = debounce(fangdou,500);(function(duration){setInterval(function(){if( totalTime > 0 ){jieliuFn1();jieliuFn2();fangdouFn();totalTime -= duration;}},duration);})(100);

運行結果

時間差 100
時間差 201
時間差 303
時間差 401
時間差 504
節流 1
時間差 98
節流 2
時間差 199
時間差 300
時間差 396
時間差 496
時間差 597
節流 1
時間差 100
節流 2
時間差 203
時間差 299
時間差 402
時間差 500
節流 1
時間差 103
時間差 204
節流 2
時間差 303
時間差 400
節流 2
防抖

結論

由以上運行結果可以看出,節流1 出現了 3 次,節流2 出現了 4 次,防抖出現了 1 次。防抖實現順利,但是兩個節流方法的執行結果存在差異。
觀察時間差可以看出,每次節流1 執行時,時間差并不會都是 500 整,也就是說,一共調用 2 秒時,節流1 并不能做到每隔 500 毫秒執行一次而共執行 4 次,第四次執行往往因為前面的 3 次執行的時間誤差,而導致到達時間 2 秒時,最后一次的時間差無法達到 時間間隔 500ms 以上,以至于只能執行 3 次。

結論:當在一個大范圍的時間內,比如兩小時內,每幾分鐘執行一次,超過2小時則不再實行,推薦使用第一種節流方式,;如果僅僅要求間隔一定時間執行一次,推薦使用第二種節流方法;防止頻繁操作,比如表單多次提交,推薦使用防抖。

如有問題,歡迎指正,謝謝!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539045.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539045.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539045.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python 第三方繪圖庫_D3py首頁、文檔和下載 - 基于 D3 的 Python 繪圖庫 - OSCHINA - 中文開源技術交流社區...

D3py 是一個基于 D3 的 Python 繪圖庫,可以像 D3 那樣畫出可交互的漂亮圖形。D3py 的目的是把來自命令行或者腳本的數據畫到瀏覽器窗口,d3py 通過構建兩個優秀的包來實現這一點。 第一個是 d3.js(Mike Bostock),它是一個用于創建數據驅動文檔…

web 前端 如何分享到instagram_如何找到靠譜的Web培訓機構?web前端培訓機構哪個好?...

現如今Web前端開發應用越來越廣泛,Web前端工程師人才需求逐年遞增,薪資待遇也是水漲船高,也因此吸引了越來越多的人想要邁入Web前端行業,參加Web前端培訓是很多人選擇學習前端開發技能的途徑,那么Web前端培訓機構哪個好…

java main 命令行_java Main 命令行

CLI 即Command Line Interface,也就是"命令行接口",它為Java 程序訪問和解析命令行參數提供了一種統一的接口。apache Commons CLI為用戶提供了一個解釋命令行的API.它在解釋命令行時主要有三個狀態,即:定義、解釋和詢問…

zookeeper命令行操作

進入命令行 運行 zkCli.sh –server <ip>進入命令行工具。 [rootzk1 bin]# zkCli.sh -server <不加ip地址&#xff0c;連接本地zookeeper> Error: no argument found for option -server Connecting to localhost:2181 [zk: localhost:2181(CONNECTED) 0] …

Spring Data JPA 實例查詢

轉自&#xff1a;https://www.cnblogs.com/rulian/p/6533109.html 一、相關接口方法 在繼承JpaRepository接口后&#xff0c;自動擁有了按“實例”進行查詢的諸多方法。這些方法主要在兩個接口中定義&#xff0c;一是QueryByExampleExecutor&#xff0c;一個是JpaRepository&am…

python可變參數函數二階導數公式_Python中函數的參數定義和可變參數

剛學用Python的時候&#xff0c;特別是看一些庫的源碼時&#xff0c;經常會看到func(*args, **kwargs)這樣的函數定義&#xff0c;這個*和**讓人有點費解。其實只要把函數參數定義搞清楚了&#xff0c;就不難理解了。先說說函數定義&#xff0c;我們都知道&#xff0c;下面的代…

windows找不到文件gpedit.msc_此電腦右鍵管理提示windows找不到文件的解決方法

也許當你右鍵點擊此電腦管理時&#xff0c;也許會出現Windows找不到文件的提示&#xff0c;下面提供一些解決方法&#xff1a;1、首先按下“Windows”R組合鍵打開運行&#xff0c;在彈出的“運行“對話框中輸入”compmgmt.msc“&#xff0c;點擊”確定“&#xff1b;2、如果此時…

java序列化流_java 序列化流與反序列化流

一 對象序列化流ObjectOutputStreamObjectOutputStream 將Java對象的基本數據類型和圖形寫入OutputStream。可以使用ObjectInputStream讀取(重構)對象。通過在流中使用文件可以實現對象的持久存儲。注意&#xff1a;只能將支持 java.io.Serializable 接口的對象寫入流中用于從流…

【spring boot】注解@ApiParam @PathVariable @RequestParam三者區別

1.ApiParam&#xff0c;就是用于swagger提供開發者文檔&#xff0c;文檔中生成的注釋內容。 ApiOperation( value "編輯公告", notes "編輯公告", httpMethod "POST" )RequestMapping( value "/edit", method RequestMethod.POST…

Zookeeper Watch監聽

概述 ZooKeeper -server host:port cmd args stat path [watch] ls path [watch] ls2 path [watch] get path [watch] watch監聽有不同的類型&#xff0c;有監聽狀態的stat &#xff0c;內容的get&#xff0c;目錄結構的ls。 命令使用一次&#xff0c;只監聽…

win10文件顯示后綴名_win10系統,如何去除“此電腦” 里的6個多余文件夾

Windows系統從XP到win7,再到進化到如今的win10&#xff0c;在系統性能和使用便捷性方面&#xff0c;確實改進了很多&#xff0c;但是&#xff0c;金無赤足&#xff0c;沒有完美的東西&#xff0c;總是有一些小細節讓我們感覺不舒服&#xff0c;如如鯁在喉。比如我們下面看到的這…

ubuntu sun-java6-jre_在 Ubuntu Lucid 下請回 Sun Java6 Jre, 趕走 OpenJDK

Ubuntu Lucid 將 sun-java6-jre 系列包移出了源&#xff0c;java軟件用 openjdk系列包提供支持。然而在某些軟件(比如FreeRapid)的使用中&#xff0c;openjdk還是喜歡出一些莫名其妙的錯誤(比如棧溢出)&#xff0c;因此考慮請回sun-java6-jre。具體方法很簡單&#xff0c;首先添…

數字化工廠的五大系統_如何搭建以MES系統為核心的數字化工廠?

MES強調車間級的過程集成、控制和監控&#xff0c;以及合理地配置和組織所有資源。滿足車間信息化需要&#xff0c;提高車間對隨機事件的快速響應和處理能力&#xff0c;有力地促進企業信息化進程向車間層拓展。通過構建以“精益生產、智能制造”為特點的車間管理系統&#xff…

zookeeper數據結構及Znode類型

結構 1、層次化的目錄結構&#xff0c;命名符合常規文件系統規范 2、每個節點在zookeeper中叫做znode,并且其有一個唯一的路徑標識。 3、節點Znode可以包含數據和子節點&#xff08;但是EPHEMERAL類型的節點不能有子節點&#xff09;。 4、客戶端應用可以在節點上設置監視器…

Windows10下手工強制清理刪掉安裝版的JRE8導致java.exe無法運行的解決辦法

error:could not open xxxx.jvm.cfg 參考&#xff1a;https://blog.csdn.net/u010102493/article/details/18425267 1.搜索并刪掉C:\Windows\System32下&#xff1a;java*.exe 仍然不行&#xff1a; 在WIN10的開始菜單搜索java C:\ProgramData\Oracle\Java下還有一些東西。 確認…

設計企業網站大綱_企業網站設計布局

網站制作一年350元&#xff0c;五站合一&#xff0c;快速建站 &#xff0c;www.sxjcwzjs.com,只需進入網站右上角注冊快速建站即可(需要電腦登錄注冊)&#xff0c;需要聯系我吧&#xff01;電話&#xff1a;13752214574&#xff0c;微信號&#xff1a;m1078582894企業網站布局很…

python畫子圖_Python使用add_subplot與subplot畫子圖操作示例

本文實例講述了Python使用add_subplot與subplot畫子圖操作。分享給大家供大家參考&#xff0c;具體如下&#xff1a;子圖&#xff1a;就是在一張figure里面生成多張子圖。Matplotlib對象簡介FigureCanvas 畫布Figure 圖Axes 坐標軸(實際畫圖的地方)注意&#…

vue導入靜態js_如何在vue js中加載靜態圖像

我有一個組件,它接受一個prop字符串,即一個url。它可以是遠程圖片,也可以是資產文件夾中的本地靜態資產。目錄結構:-assets/- logo.png-app.vue-components/-ImageTest.vue圖像測試.vue{{imagelink}}export default {name: "ImageTest",props:{imagelink: String,},c…

Zookeeper JavaApi 增刪改查

官網API http://zookeeper.apache.org/doc/r3.4.6/api/index.html JAR包 \zookeeper-3.3.6\lib\ jline-0.9.94.jar \zookeeper-3.3.6\lib\ log4j-1.2.15.jar \zookeeper-3.3.6\ zookeeper-3.3.6.jar Demo代碼 注意代碼中的注解 package hello.zookeeper.api;import java.uti…

搭建linux測試環境有什么用_談談現在搭建網站用什么程序好,選擇對的程序是很重要的開頭...

目前可以選擇的網站程序還是蠻多的&#xff0c;開源的系統也很多&#xff0c;也有很多精品。更多時候&#xff0c;選擇網站程序要結合網站的定位。說說dedecms&#xff0c;就是我們都知道的織夢程序&#xff0c;功能很齊全&#xff0c;作為一個簡單的資訊門戶網站&#xff0c;算…