Js 防抖与节流

Js 防抖与节流

【概述】防抖和节流算性能优化的知识,所以记录下防抖与节流,从概念、使用场景到代码的简单实现。
比如:监听滚动,基本每个网站都会有返回顶部的按钮,当用户下拉到一定高度时,会出现返回顶部按钮。那我们现在写一下这个功能代码如下:
function showTop() {
      var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
      console.log('滚动条位置:' + scrollTop);
    }
    window.onscroll = showTop
// 滚动一下会执行 n次
但是当你用鼠标滚轮进行滚动时,你会发现~~轻轻~~滚动一下,该函数会执行相当多的次数,有时候我们并不需要执行这么多的次数,只需一次即可,所以接下来是如何优化这个功能。

防抖

我们可以提供一种思路,在第一次触发事件时,不立即执行函数,而是给出一个时间 500ms:如果 500ms 内没有再次触发滚动事件,那么就执行函数。如果在 500ms 内再次触发滚动事件,那么当前的计时取消,重新开始计时。代码如下:
/*
* fn [function] 需要防抖的函数
* delay [number] 毫秒,防抖期限值
*/
function debounce(fn, delay) {
  let timer = null; // 定义空变量
  return function () {
    if (timer) {
      clearTimeout(timer);
      // 说明当前正在计时,并且又触发了相同事件,所以清除当前计时器。
    }
    timer = setTimeout(fn, delay); // 反之则启动。
  }
}
// 结合滚动函数
window.onscroll = debounce(showTop, 1000)
此时函数会在1秒后执行,以上就是简单的防抖,对于短时间内多次触发的事件,让它在规定时间内只触发一次。

节流

如果用户不停的滚动鼠标滚轮,那么事件就永远不会触发,所以问题又出来了。
我们可以设计一个开关,函数执行一次后,在某个时间段内失效,过了这段时间再开启。
function throttle(fn, delay) {
  let flag = true
  return function () {
    if (!flag) {
      // 关
      return false
    }
    // 开,执行函数并且在间隔期内把状态位设为无效
    flag = false
    setTimeout(() => {
      fn()
      flag = true;
    }, delay)
  }
}
// 结合滚动函数
window.onscroll = throttle(showTop, 1000)
至此当用户持续滚动时,函数任会以1秒时间间隔来运行。
区别:中括号法可以用变量作为属性名,而点方法不可以。 中括号法可以用数字作为属性名,而点语法不可以。

其他场景

比如用户搜索内容 input 事件,支持实时搜索就可以用节流,还有页面响应式大小 resize 适配大小屏,这种情况可以使用防抖,只需判断最后一次的变化值。

总结

以上内容基于防抖和节流的核心思实现了简单的代码,具体的情况还要看业务逻辑。如参数传递,作用域改变等。
see you ~~

你可能感兴趣的:(Js 防抖与节流)