日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

7分钟理解JS的节流、防抖及使用场景

發布時間:2024/4/13 javascript 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 7分钟理解JS的节流、防抖及使用场景 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

據說阿里有一道面試題就是談談函數節流函數防抖。 糟了,這可觸碰到我的知識盲區了,好像聽也沒聽過這2個東西,痛定思痛,趕緊學習學習。here we go!

概念和例子

函數防抖(debounce)

在事件被觸發n秒后再執行回調,如果在這n秒內又被觸發,則重新計時。

看一個?(栗子):

//模擬一段ajax請求 function ajax(content) {console.log('ajax request ' + content) }let inputa = document.getElementById('unDebounce')inputa.addEventListener('keyup', function (e) {ajax(e.target.value) })復制代碼

看一下運行結果:

可以看到,我們只要按下鍵盤,就會觸發這次ajax請求。不僅從資源上來說是很浪費的行為,而且實際應用中,用戶也是輸出完整的字符后,才會請求。下面我們優化一下:

//模擬一段ajax請求 function ajax(content) {console.log('ajax request ' + content) }function debounce(fun, delay) {return function (args) {let that = thislet _args = argsclearTimeout(fun.id)fun.id = setTimeout(function () {fun.call(that, _args)}, delay)} }let inputb = document.getElementById('debounce')let debounceAjax = debounce(ajax, 500)inputb.addEventListener('keyup', function (e) {debounceAjax(e.target.value)}) 復制代碼

看一下運行結果:

可以看到,我們加入了防抖以后,當你在頻繁的輸入時,并不會發送請求,只有當你在指定間隔內沒有輸入時,才會執行函數。如果停止輸入但是在指定間隔內又輸入,會重新觸發計時。 再看一個?:

let biu = function () {console.log('biu biu biu',new Date().Format('HH:mm:ss')) }let boom = function () {console.log('boom boom boom',new Date().Format('HH:mm:ss')) }setInterval(debounce(biu,500),1000) setInterval(debounce(boom,2000),1000) 復制代碼

看一下運行結果:

這個?就很好的解釋了,如果在時間間隔內執行函數,會重新觸發計時。biu會在第一次1.5s執行后,每隔1s執行一次,而boom一次也不會執行。因為它的時間間隔是2s,而執行時間是1s,所以每次都會重新觸發計時

個人理解 函數防抖就是法師發技能的時候要讀條,技能讀條沒完再按技能就會重新讀條。

函數節流(throttle)

規定在一個單位時間內,只能觸發一次函數。如果這個單位時間內觸發多次函數,只有一次生效。

看一個?:

function throttle(fun, delay) {let last, deferTimerreturn function (args) {let that = thislet _args = argumentslet now = +new Date()if (last && now < last + delay) {clearTimeout(deferTimer)deferTimer = setTimeout(function () {last = nowfun.apply(that, _args)}, delay)}else {last = nowfun.apply(that,_args)}}}let throttleAjax = throttle(ajax, 1000)let inputc = document.getElementById('throttle')inputc.addEventListener('keyup', function(e) {throttleAjax(e.target.value)}) 復制代碼

看一下運行結果:

可以看到,我們在不斷輸入時,ajax會按照我們設定的時間,每1s執行一次。

結合剛剛biubiubiu的?:

let biubiu = function () {console.log('biu biu biu', new Date().Format('HH:mm:ss'))}setInterval(throttle(biubiu,1000),10)復制代碼

不管我們設定的執行時間間隔多小,總是1s內只執行一次。

個人理解 函數節流就是fps游戲的射速,就算一直按著鼠標射擊,也只會在規定射速內射出子彈。

總結

  • 函數防抖和函數節流都是防止某一時間頻繁觸發,但是這兩兄弟之間的原理卻不一樣。
  • 函數防抖是某一段時間內只執行一次,而函數節流是間隔時間執行。

結合應用場景

  • debounce
    • search搜索聯想,用戶在不斷輸入值時,用防抖來節約請求資源。
    • window觸發resize的時候,不斷的調整瀏覽器窗口大小會不斷的觸發這個事件,用防抖來讓其只觸發一次
  • throttle
    • 鼠標不斷點擊觸發,mousedown(單位時間內只觸發一次)
    • 監聽滾動事件,比如是否滑到底部自動加載更多,用throttle來判斷

拓展

參考鏈接:www.cnblogs.com/zichi/p/533…

這是高程中的經典代碼:

function throttle(method, context) {clearTimeout(method.tId);method.tId = setTimeout(function () {method.call(context);}, 100)}復制代碼

我們通過上面的例子知道,其實這段函數應該是debounce函數防抖,而不是函數節流,很多文章也都會拿這段代碼來做例子,函數本身沒錯,但是命名錯了。

原作者的這段話就寫的很好,

就以 throttle 為例,某日,老師給你布置了一個作業,讓你深入理解一下 throttle,第二天上課來聊聊。張三心里非常高興,這個概念在經典書籍《JavaScript高級程序設計》中見過,打開一看,就兩頁,而且解釋地非常清晰,看完就高興地干別的事情去了。而李四,覺得高程三講的有點少,而去谷歌了下其他關于 throttle 的知識點,興奮地看到 throttle 函數的好幾種寫法,發現高程三只是用了最簡單的方式,還有更優雅運用場景更多的寫法,或許此時他已經發現和 throttle 同時出現的還有個 debounce,這是什么鬼?反正老師沒說,以后再看吧,于是心滿意足地玩游戲去了。而王五,和李四一樣發現了 debounce,這是什么?一起了解了吧,繼而發現 debounce 的用法居然和高程三中的 throttle 一樣!繼續挖下去,發現高程三中的 throttle 函數其實應該叫 debounce,看到最后,王五已經把 throttle 和 debounce 徹底理解了。

我們要做王五,并且爭取早日產出一手知識!加油!

廣而告之

本文發布于薄荷前端周刊,歡迎Watch & Star ★,轉載請注明出處。

歡迎討論,點個贊再走吧 。???。 ~

總結

以上是生活随笔為你收集整理的7分钟理解JS的节流、防抖及使用场景的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美卡一卡二 | 黄色一二三区 | 成人av网站免费 | 丝袜+亚洲+另类+欧美+变态 | 一区二区精品国产 | 中文字幕在线视频一区二区三区 | 国产欧美日韩亚洲 | 久久黄视频| 国产激情视频在线观看 | 国产伦精品一区二区三区精品 | 嫩草嫩草嫩草嫩草嫩草 | 中文字幕亚洲欧美 | 噼里啪啦动漫高清在线观看 | 国产成人免费视频网站 | 超污视频软件 | 成人小视频在线播放 | 午夜777 | 中文字幕人妻一区 | 中文字幕欧美色图 | jizzjizz在线| 色爱视频 | 国产吃瓜在线 | 麻豆国产一区二区三区 | 精品国产一区二区三区在线 | 黄色片18| 尤物国产在线 | 少妇把腿扒开让我舔18 | 天天摸天天爽 | 欧美色欧美 | 欧洲高潮三级做爰 | 中文字幕在线第一页 | 邵氏电影《金莲外传2》免费观看 | 亚洲国产精品狼友在线观看 | 就要操就要日 | 日本一区二区视频免费 | 性av网 | 午夜看黄神器 | 在线精品自拍 | 麻豆精品国产传媒av | 91免费入口 | 欧美日韩有码 | 中文字幕一区二区在线播放 | 91波多野结衣 | 中文字幕亚洲无线码在线一区 | 久操久操| 欧美少妇诱惑 | 亚洲经典在线观看 | 波多野结衣成人在线 | 国产香蕉97碰碰碰视频在线观看 | 精品国产一区二区三区日日嗨 | 亚洲欧美日韩中文字幕在线观看 | 精品www久久久久久奶水 | 天天干夜夜 | 国产在视频线精品视频 | 亚洲午夜精品视频 | 国产 日韩 一区 | 国产曰肥老太婆无遮挡 | 欧美特黄aaaaaa | 亚洲激情第一页 | 伊人久久大香线蕉 | 麻豆成人免费 | 国产精品av在线播放 | 91九色中文| 内射一区二区三区 | 亚洲热在线 | 蜜桃av乱码一区二区三区 | 色黄网站在线观看 | 国产精品igao | 国久久久 | 色网站入口 | 亚洲一区二区三区久久久成人动漫 | 海角社区id:1220.7126,10. | 国产精品jizz在线观看软件 | 91官网入口| 亚洲啪啪网站 | 亚洲国产精品久久久久 | 亚洲成人精品一区二区三区 | 男女男精品视频网站 | 99精品网站| 国产成人午夜视频 | www.久久国产| 中文字幕在线视频网 | 免费在线成人 | 欧美一级在线看 | 日韩精品黄| 国产aⅴ激情无码久久久无码 | 影音先锋国产资源 | 91福利区 | 91不卡在线| 91av视频免费观看 | 亚洲美女啪啪 | 蜜臀99久久精品久久久久久软件 | 国产精品一线 | 一区二区三区小视频 | 亚洲插| 伊人热久久 | 波多野结衣亚洲一区 | 卡通动漫精品一区二区三区 | 最近日本中文字幕 |