首頁 > web前端 > js教程 > 主體

javascript基本函數debounce、poll和once實例用法詳解

伊谢尔伦
發布: 2018-05-26 09:13:01
原創
5500 人瀏覽過

debounce

對於高耗能事件,debounce 函式是一種不錯解決方案。如果你不對 scroll、resize、和 key* 事件使用 debounce  函數,那麼你幾乎等同於犯了錯誤。下面的 debounce 函數能讓你的程式碼保持高效率:

// 返回一个函数,如果它被不间断地调用,它将不会得到执行。该函数在停止调用 N 毫秒后,再次调用它才会得到执行。如果有传递 ‘immediate' 参数,会马上将函数安排到执行队列中,而不会延迟。
function debounce(func, wait, immediate) {
  var timeout;
  return function() {
    var context = this, args = arguments;
    var later = function() {
      timeout = null;
      if (!immediate) func.apply(context, args);
    };
    var callNow = immediate && !timeout;
    clearTimeout(timeout);
    timeout = setTimeout(later, wait);
    if (callNow) func.apply(context, args);
  };
};
 
// 用法
var myEfficientFn = debounce(function() {
    
// 所有繁重的操作
}, 250);
window.addEventListener('resize', myEfficientFn);
登入後複製

debounce 函數不允許回呼函數在指定時間內執行多於一次。當為一個會頻繁觸發的事件指派一個回呼函數時,該函數顯得特別重要。

poll

儘管上面提及了debounce 函數,但如果事件不存在時,你就不能插入一個事件以判斷所需的狀態,那就需要每隔一段時間去檢查狀態是否達到你的要求。

function poll(fn, callback, errback, timeout, interval) {
  var endTime = Number(new Date()) + (timeout || 2000);
  interval = interval || 100;
 
  (function p() {
      
// 如果条件满足,则执行!
      if(fn()) {
        callback();
      }
      
// 如果条件不满足,但并未超时,再来一次
      else if (Number(new Date()) < endTime) {
        setTimeout(p, interval);
      }
      
// 不匹配且时间消耗过长,则拒绝!
      else {
        errback(new Error('timed out for ' + fn + ': ' + arguments));
      }
  })();
}
 
// 用法:确保元素可见
poll(
  function() {
    return document.getElementById('lightbox').offsetWidth > 0;
  },
  function() {
    
// 执行,成功的回调函数
  },
  function() {
    
// 错误,失败的回调函数
  }
);
登入後複製

Polling 在 web 中已被應用很長時間了,並在將來仍會被使用。

once

有時候,你想讓一個給定的功能只發生一次,類似於 onload 事件。下面的程式碼提供了你所說的功能:

function once(fn, context) { 
  var result;
 
  return function() { 
    if(fn) {
      result = fn.apply(context || this, arguments);
      fn = null;
    }
 
    return result;
  };
}
 
// 用法
var canOnlyFireOnce = once(function() {
  console.log('Fired!');
});
 
canOnlyFireOnce(); 
// "Fired!"
canOnlyFireOnce(); 
// nada 
          
// 没有执行指定函数
登入後複製

once 函數確保給定函數只能被呼叫一次,從而防止重複初始化!

以上是javascript基本函數debounce、poll和once實例用法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!