防抖 節流_【前端面試】節流與防抖

我們用兩張圖表示什么是節流和防抖。

8b1d4c2d9f90deffca647bf88adfc769.png
防抖

495544e51e4778fec2a219f38850446b.png
節流

由圖可見,防抖的意思是,當用戶在一段時間內連續頻繁的試圖執行一個函數的時候,只有最后一次,函數被真正的執行。節流的意思是,當用戶在某一個時刻執行了一次函數的時候,在一段時間 t 內,再次執行該函數都沒有作用

下面,我們用實例,寫一個防抖和節流出來。

請先利用下面的命令安裝 jquery,在項目根目錄下執行。

npm install jquery -save

在 body 里添加

<button id="btn1">btn1</button>

一、防抖

        let id;$("#btn1").on('click',function(e){clearTimeout(id);id = setTimeout(function(){console.log('button clicked',id)},1000);})

這是一個最簡單的防抖,但是,缺點是明顯的,一個臨時變量被放在 window 對象里面了,污染了全局變量空間。因此,我們想把這個變量寫成局部的,有經驗的同學一定知道,我們該用閉包了,既,使用柯理化函數的編程思想。事實上,上面的這個例子已經是一個閉包了,因為最外層的 id 接住了函數內部 setTimeout 的返回值,因此這個函數的棧內存是不會銷毀的。只是,我們的優化方案需要在此基礎上再加一層。

本著這個思路,我們有:

        function debounce(){let id;return function(){clearTimeout(id);id = setTimeout(function(){console.log('button clicked',id)},1000);}}var fn = debounce();$("#btn1").on('click',function(e){fn();})

首先,一個全局變量 fn 接住了 debounce 的一個返回值,閉包形成,debounce 內部的 id 被保存住,因此,每次 fn 執行的時候,它所用到的 id 都是一個,這和第一個例子當中全局作用域上面的 id 是等價的,只不過,不會污染全局作用域。

防抖的原理是,如果用戶頻繁的點擊按鈕,上一次的 setTimeout 都會立刻被下一次清除,需要執行的函數始終打不出來,只有最后一次沒人清除它,因此會被執行。

二、節流

下面我們講節流,首先,我們還是利用全局作用域寫一個簡單的版本。

        let time = new Date();$("#btn1").on('click', function (e) {let time1 = new Date();if (time1 - time > 2000) {console.log(time1 - time);time = time1;}})

同樣的,這套方法污染了全局作用域,因此,我們需要寫個閉包出來,保存局部變量。

        function throttle() {let time = new Date();return function () {let time1 = new Date();if (time1 - time > 2000) {console.log(time1 - time);time = time1;}}}let fn = throttle();$("#btn1").on('click', function (e) {fn();})

節流的原理比防抖更簡單,當函數被成功的執行過一次,本次成功執行的時間會被記錄下來,那么當用戶頻繁點擊按鈕的時候,這些次記錄的時間距離上次成功執行的時間太短,小于閾值,因此不被執行。

請各位同學一定要把代碼搞到本地跑一遍,這樣才能加深印象。

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

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

相關文章

沒數據時y軸不顯示_Matplotlib數據可視化

1.Matplotlib介紹什么是MatplotlibMatplotlib是一個Python的繪圖庫&#xff0c;它可與 NumPy 一起使用&#xff0c;可以代替MMatplotlib安裝由于Matplotlib是第三方庫&#xff0c;所以我們需要安裝它才可以使用。注意&#xff0c;Matplotlib3.0要求python3版本才可安裝使用。安…

1099: 角谷猜想(多實例測試)

1099: 角谷猜想&#xff08;多實例測試&#xff09; 時間限制: 1 Sec 內存限制: 128 MB 提交: 5930 解決: 3888 [提交] [狀態] [討論版] [命題人:admin] 題目描述 任何一個自然數&#xff0c;如果是偶數&#xff0c;就除以2&#xff0c;如果是奇數&#xff0c;就乘以3再加1。最…

python軟件運行界面_python運行界面 python的圖形用戶界面怎么運行

為什么用Python開發界面應用程序1)wxWidgets是一個比MFC優雅的庫&#xff0c;TortoiseCVS用wxWidges而不用MFC&#xff0c;就是因為wxWidgets好用&#xff0c;而不是為了可以移植。 2)Python的面向對象腳本語言編程適合快速界面開發 3)Python在服務器端和客戶端都非常有前途&am…

1100: 求組合數(函數專題)

1100: 求組合數&#xff08;函數專題&#xff09; 時間限制: 1 Sec 內存限制: 128 MB 提交: 6264 解決: 4653 [提交] [狀態] [討論版] [命題人:admin] 題目描述 馬上要舉辦新生程序設計競賽了&#xff0c;與以往不同的是&#xff0c;本次比賽以班為單位&#xff0c;為了全面衡量…

python畫圖隱藏畫筆_python畫圖

轉至&#xff1a;https://blog.csdn.net/weixin_43943977/article/details/1026913921、灰色櫻花樹from turtle import *from random import *from math import *def tree(n,l):pd()#下筆#陰影效果t cos(radians(heading()45))/80.25pencolor(t,t,t)pensize(n/3)forward(l)#畫…

1101: 逆序數字(函數專題)

1101: 逆序數字&#xff08;函數專題&#xff09; 時間限制: 1 Sec 內存限制: 128 MB 提交: 6333 解決: 4717 [提交] [狀態] [討論版] [命題人:admin] 題目描述 輸入一個正整數n&#xff0c;計算n的逆序數m&#xff0c;輸出m與n的和。要求程序定義一個inverse()函數和一個main(…

循環劃線_經濟內外雙循環下的思考!

原創&#xff1a;群贏說到這個內外雙循環&#xff0c;我們汽車后市場朋友們&#xff0c;應該知道車子發動機水冷系統就是一個雙循環&#xff0c;內部小循環&#xff0c;外部大循環。在發動機溫度不高的時候&#xff0c;水在做小循環&#xff0c;在發動機周邊流動。當發動機溫度…

1103: 平均學分績點(函數專題)

1103: 平均學分績點&#xff08;函數專題&#xff09; 時間限制: 1 Sec 內存限制: 128 MB 提交: 5386 解決: 2917 [提交] [狀態] [討論版] [命題人:admin] 題目描述 平均學分績點&#xff08;Grade Point Average&#xff0c;即GPA&#xff09;是以學分與績點作為衡量學生學習的…

1102: 火車票退票費計算(函數專題)

1102: 火車票退票費計算&#xff08;函數專題&#xff09; 時間限制: 1 Sec 內存限制: 128 MB 提交: 5055 解決: 3204 [提交] [狀態] [討論版] [命題人:admin] 題目描述 2013年起&#xff0c;火車票退票費比例下調&#xff1a;票面乘車站開車時間前48小時以上的按票價5%計退票費…

ksrot php_php中ksort函數的功能起什么作用呢?

摘要:下文講述php中ksort函數的功能講解&#xff0c;如下所示&#xff1b;ksort函數功能說明:根據數組的鍵名進行升序排列ksort語法:ksort(array,sortingtype);--------參數說明------array:必填參數,待進行操作的數組sortingtype&#xff1a;非必填參數&#xff0c;此參數值可…

1104: 求因子和(函數專題)

1104: 求因子和&#xff08;函數專題&#xff09; 時間限制: 1 Sec 內存限制: 128 MB 提交: 4633 解決: 3669 [提交] [狀態] [討論版] [命題人:admin] 題目描述 輸入正整數n&#xff08;2<n<1000&#xff09;&#xff0c;計算并輸出n的所有正因子(包括1&#xff0c;不包括…

計算機組成原理實驗軟件仿真系統_計算機系統組成原理(基礎)

網上關于計算機系統的討論眾說紛紜。剛開始&#xff0c;我卯足了勁想尋找一個標準答案&#xff0c;后來發現這并不存在&#xff01;因為計算機系統層次不一&#xff0c;看你從什么角度來理解這個問題。在這篇文章里&#xff0c;我的介紹一切從簡&#xff0c;不求錦上添花&#…

1107: 回文數猜想(函數專題)

1107: 回文數猜想&#xff08;函數專題&#xff09; 時間限制: 1 Sec 內存限制: 128 MB 提交: 3922 解決: 2508 [提交] [狀態] [討論版] [命題人:admin] 題目描述 一個正整數&#xff0c;如果從左向右讀&#xff08;稱之為正序數&#xff09;和從右向左讀&#xff08;稱之為倒序…

機器人總動員中的小草_機器人總動員讀后感

1機器人總動員讀后感機器人總動員讀后感(一)昨天&#xff0c;我看了一部電影《機器人總動員》&#xff0c;主人公是一個機器人&#xff0c;它叫瓦力。非常好看。這部電影講的是幾百年以后&#xff0c;地球被人們弄得全是垃圾&#xff0c;人類沒辦法在地球上生活了&#xff0c;只…

輸入回車時結束循環python_python-用戶輸入退出以在循環時中斷

最簡單的解決方案可能是創建一個函數,該函數將顯示的消息作為輸入,并在測試其滿足條件后返回用戶輸入&#xff1a;def guess_input(input_message):flag False#endless loop until we are satisfied with the inputwhile True:#asking for user inputguess input(input_messa…

1109: 數根(函數專題)

1109: 數根&#xff08;函數專題&#xff09; 時間限制: 1 Sec 內存限制: 128 MB 提交: 4149 解決: 3263 [提交] [狀態] [討論版] [命題人:admin] 題目描述 輸入一個正整數&#xff0c;輸出該數的數根。數根可以通過把一個數的各個位上的數字加起來得到。如果得到的數是一位數&…

python中while語句是_如何在Python中使用while語句[適合初學者]

while語句是重復循環的語句&#xff0c;那么如何用Python編寫&#xff0c;下面Gxl網就帶領大家來學習一下Python中使用while語句。【推薦閱讀&#xff1a;Python視頻教程】一&#xff1a;什么是while語句&#xff1f;Python中怎么使用whilewhile語句重復用于相同的過程進行重復…

1110: 最近共同祖先(函數專題)

1110: 最近共同祖先&#xff08;函數專題&#xff09; 時間限制: 1 Sec 內存限制: 128 MB 提交: 3818 解決: 3290 [提交] [狀態] [討論版] [命題人:admin] 題目描述 如上圖所示&#xff0c;由正整數1, 2, 3, …組成了一棵無限大的二叉樹。從某一個結點到根結 點&#xff08;編…

echart freemarker 模板_SpringBoot集成Freemarker模板生成Echarts圖片(三)

緊接著前面兩篇&#xff0c;本篇采用Freemarker模板來生成Echarts圖片。一. 項目結構二. Freemarker模板(1)柱狀圖{"title": {"text": "${title}","textStyle": {"color": "red","fontSize": 15,"…

ios 系統提示框_ios13終于能屏蔽系統更新了!附詳細教程

很多人會遇到這樣的煩惱&#xff0c;ios頻繁更新&#xff0c;自己用慣了當前系統版本&#xff0c;系統總提示新的更新請求&#xff0c;不小心點到之后&#xff0c;系統就會自動更新安裝&#xff0c;有很多小伙伴更新后&#xff0c;手機變卡頓&#xff0c;耗電量加大&#xff0c…