美文网首页
函数防抖与函数节流

函数防抖与函数节流

作者: 时间的溺水者 | 来源:发表于2021-03-27 22:50 被阅读0次

函数防抖(debounce): 延迟一段时间再执行函数,如果这段时间内又触发了该函数,则延迟重新计算;

// 非立即执行版
function debounce(func, wait) {
    let timer;
    return function() {
      let context = this; // 注意 this 指向
      let args = arguments; // arguments中存着e
         
      if (timer) clearTimeout(timer);
 
      timer = setTimeout(() => {
        func.apply(this, args)
      }, wait)
    }
}

使用方法:

content.onmousemove = debounce(count,1000);

非立即执行版的意思是触发事件后函数不会立即执行,而是在 n 秒后执行,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。

// 立即执行版
function debounce(func, wait) {
    let timer;
    return function() {
      let context = this; // 这边的 this 指向谁?
      let args = arguments; // arguments中存着e
 
      if (timer) clearTimeout(timer);
 
      let callNow = !timer;
 
      timer = setTimeout(() => {
        timer = null;
      }, wait)
 
      if (callNow) func.apply(context, args);
    }
}

立即执行版的意思是触发事件后函数会立即执行,然后 n 秒内不触发事件才能继续执行函数的效果。用法同上

节流: 指连续触发事件但是在 n 秒中只执行一次函数。

同样有两个版本,时间戳和定时器版。

// 时间戳版
function throttle(func, wait) {
    let previous = 0;
    return function() {
      let now = Date.now();
      let context = this;
      let args = arguments;
      if (now - previous > wait) {
        func.apply(context, args);
        previous = now;
      }
    }
}

使用方式如下:

content.onmousemove = throttle(count,1000);

定时器版

function throttle(func, wait) {
    let timeout;
    return function() {
      let context = this;
      let args = arguments;
      if (!timeout) {
        timeout = setTimeout(() => {
          timeout = null;
          func.apply(context, args)
        }, wait)
      }
    }
}

相关文章

网友评论

      本文标题:函数防抖与函数节流

      本文链接:https://www.haomeiwen.com/subject/ejqriktx.html