亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript中防抖與節流指的是什么意思

發布時間:2021-12-29 10:27:49 來源:億速云 閱讀:127 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“JavaScript中防抖與節流指的是什么意思”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“JavaScript中防抖與節流指的是什么意思”這篇文章吧。

一、函數防抖(debounce)

1. 什么是防抖?

函數防抖: 在頻繁觸發某一個事件時,一段時間內不再觸發該事件后才會去調用對應的回調函數,在設定間隔時間內如果下一次事件被觸發, 那么就重新開始定時器,直到事件觸發結束。

規定時間內沒有繼續觸發事件的前提下,再去調用事件處理函數;

具體如下面的例子所示:

/*定義防抖函數
 * func:傳入一個函數,事件不再持續觸發時會調用該函數
 * delay:定義持續多久后執行傳入的回調函數
 * */
 function debounce(func,delay) {
  let timer = null  // 用于保存定時器
  return function (...args) {
   // 如果定時器存在,清除定時器,隨后重新設置timer
   if(timer !== null) clearTimeout(timer)
   timer = setTimeout(func, delay)  // 超過delay為接收到事件會調用這里的func   必要的額時候可以修改func的this指向  由于timer對外部存在引用,因此不會被銷毀
  }
 }

 /*事件處理函數*/
 function testDeBounce(){
  console.log('你看我執行了幾次??')
 }

 // 接收debounce返回的函數
 const temp = debounce(testDeBounce(),1000)

 /*綁定事件,測試防抖函數*/
 window.addEventListener('scroll',()=>{
  temp()
 }); // 這樣寫最少調用一次事件處理函數,最多也不會多余下面的寫法執行的次數
 window.addEventListener('scroll', testDeBounce); // 如果這樣寫的話,每當頁面滾動就會調用事件處理函數

總結一下思路:

  • 1.定義一個節流函數

  • 2.函數內部使用一個變量保存定時器

  • 3.返回一個函數,函數內部定義:如果定時器已經存在就清除定時器,重新設置定時器

  • 4.定義一個變量來接收debounce返回的函數

  • 5.在事件的回調函數中直接調用上一步的變量接收的方法

二、函數節流

函數節流: 在事件持續觸發的前提下,保證一定時間段內只調用一次事件處理函數,就是函數節流;

函數節流實現的方式: 定時器、時間戳、定時器+時間戳;

2.1 定時器實現

思路:

  • 1.定義節流函數throttle

  • 2.定義timer保存定時器

  • 3.返回一個函數。函數內部定義:如果定時器不存在,設置定時器,間隔某一時間后將timer設置為null,如果在這之前事件再次觸發,則定時器中的回調無效

<button>這是一個孤獨的按鈕</button>

/*
 * 定義定時器節流函數
 * func:傳入事件處理函數
 * delay:在delay指定的時間內定時器回調無效
 * */
 function throttle(func,delay) {
  let timer = null
  const context = this
  return function(...args){
   // 如果定時器不存在
   if(!timer){
    timer = setTimeout(()=>{
     func.apply(context,args) // 考慮返回的函數調用的環境,因此這里不直接使用this
     timer = null // delay之后清除定時器
    },delay)
   }
  }
 }

 function test() {
  console.log('啊啊啊!')
 }

 const temp = throttle(test,1000)

 document.querySelector('button').addEventListener('click',()=>{
  temp()
 })

2.2 時間戳實現

var throttle = function(func, delay) {            
  var prev = Date.now();            
  return function() {                
    var context = this;                
    var args = arguments;                
    var now = Date.now();                
    if (now - prev >= delay) {                    
      func.apply(context, args);                    
      prev = Date.now();                
    }            
  }        
}    

function handle() {            
  console.log(Math.random());        
}        

window.addEventListener('scroll', throttle(handle, 1000));

2.3 時間戳+定時器

// 節流throttle代碼(時間戳+定時器):
var throttle = function(func, delay) {     
    var timer = null;     
    var startTime = Date.now();     
    return function() {             
        var curTime = Date.now();             
        var remaining = delay - (curTime - startTime);             
        var context = this;             
        var args = arguments;             
        clearTimeout(timer);              
        if (remaining <= 0) {                    
            func.apply(context, args);                    
            startTime = Date.now();              
        } else {                    
            timer = setTimeout(func, remaining);              
        }      
    }
}

function handle() {      
    console.log(Math.random());
} 

window.addEventListener('scroll', throttle(handle, 1000));

以上是“JavaScript中防抖與節流指的是什么意思”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

芦山县| 安新县| 汤阴县| 长丰县| 邵阳市| 都昌县| 宜丰县| 福州市| 东城区| 榕江县| 奈曼旗| 尼木县| 赤峰市| 崇义县| 萨迦县| 辰溪县| 华坪县| 五台县| 安溪县| 松溪县| 宁阳县| 泰安市| 黎川县| 安阳市| 应城市| 弋阳县| 绥芬河市| 勃利县| 涟水县| 广德县| 孝义市| 高尔夫| 同仁县| 桂林市| 璧山县| 红安县| 马边| 罗定市| 马公市| 黑水县| 桓仁|