函數(shù)節(jié)流和函數(shù)防抖

我們知道,js有些事件例如resizemousemove等是會不間斷觸發(fā)的,例如我們簡單的一個scroll事件:

function scrollFn() {
    console.log(1)
}
window.onscroll = scrollFn

我們需要在滾動的時候去做一些事情,如上圖可見,我們只是簡單的console,在一次滾動過程中函數(shù)即執(zhí)行了將近20次,如果這個函數(shù)有更為復雜的方法,比如操作dom或者其他交互,會嚴重影響性能。

為了避免這個問題,我們一般會使用定時器來對函數(shù)進行節(jié)流。

在javascript高級程序設計中,定義了一個函數(shù)節(jié)流方法,如下:

function throttle(method,context) { // 執(zhí)行函數(shù)、哪個作用域中執(zhí)行
    clearTimeout(method.tId);
    method.tId = setTimeout(function() {
        method.call(context)
    },300)
}

throttle函數(shù)接收兩個參數(shù),即要執(zhí)行的函數(shù)及執(zhí)行環(huán)境,如果執(zhí)行環(huán)境未定義,默認則為windows。在這個函數(shù)中,會在第一次執(zhí)行時為method一個定時器屬性,在指定時間間隔(300)內(nèi)再次執(zhí)行時會清楚上一次定義的定時器并創(chuàng)建新定時器知道停止。

函數(shù)節(jié)流

函數(shù)預先設定一個執(zhí)行周期,當調(diào)用動作的時刻大于等于執(zhí)行周期則執(zhí)行該動作,然后進入下一個新周期。

 function throttle(method, duration) {
    let begin = new Date()
    return function () {
      const context = this, args = arguments
      let current = new Date()
      if (current - begin >= duration) {
        method.apply(context, args)
        begin = current
      }
    }
 }
 function resize() {
    let n = 1
    console.log(++n)
  }

  window.onresize = throttle(resize, 5000)

函數(shù)防抖

函數(shù)調(diào)用n秒后才會執(zhí)行,如果函數(shù)在n秒內(nèi)被調(diào)用的話則函數(shù)不執(zhí)行,重新計算執(zhí)行時間。

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

  function resize() {
    let n = 1
    console.log(++n)
  }

  window.onresize = debounce(resize, 500)

參考文章

函數(shù)節(jié)流和函數(shù)去抖
7分鐘理解JS的節(jié)流、防抖及使用場景

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 函數(shù)節(jié)流 還記得上篇文章中說到的圖片懶加載嗎?我們在文章的最后實現(xiàn)了一個頁面滾動時按需加載圖片的方式,即在觸發(fā)滾動...
    柏丘君閱讀 2,974評論 1 19
  • 寫在前面 在前端開發(fā)中,我們知道對于DOM的頻繁操作是非常消耗資源的,尤其是對于瀏覽器的onresize,onsc...
    jeff1804閱讀 448評論 0 0
  • 函數(shù)防抖和函數(shù)節(jié)流是在時間軸上控制函數(shù)的執(zhí)行次數(shù) 一、函數(shù)防抖(debounce)概念:在事件被觸發(fā)n秒后再執(zhí)行回...
    puxiaotaoc閱讀 458評論 0 1
  • 我們很自豪地宣布一項比賽,獲獎者將有權(quán)訪問 Play2Live 的明斯克開發(fā)辦公室,預先體驗即將推出的測試版平臺,...
    Play2Live官方中文社區(qū)閱讀 355評論 0 0
  • 天氣異常炎熱,仿佛整條柏油馬路快要被曬化了,地上騰起的熱浪將等待綠燈的人們包圍。我的襯衫濕透了,汗水將它緊緊地貼在...
    之謹閱讀 294評論 0 2

友情鏈接更多精彩內(nèi)容