JS防抖和节流原理📝

作者: forJavascript | 来源:发表于2019-12-15 00:47 被阅读0次
    防抖和节流已经是老生常谈的知识点了,也是很多场景会用到的,写这篇博客纯粹发表自己的理解并做一个记录。📝

    1. 什么是防抖 👇

    不能从字面意思来看待防抖。我第一次接触到这个概念时,还以为JS函数有抖动。😓其实是为了防止一个函数在段时间内疯狂执行。最经常出现的场景如下 🌰

    • 搜索框 input事件 🔍
    • 视窗大小变化 resize事件
    • 鼠标移动 mousemove事件 🖱️
    • 等等。。

    先从原理出发。我对防抖的理解:不希望某个事件在短时间内疯狂触发,影响性能,所以我们设置一个定时器,让这个事件在一定时间延迟后再执行,如果这个延迟中间中途这个事件又触发了,那就把上次事件绑定的定时器取消,避免了上次事件执行,然后重新设置一个定时器绑定在当前事件上。
    由原理可知,我们需要一个变量指向定时器,而且这个变量应该是‘全局变量’,可以用闭包实现这个‘全局变量’。这里的‘全局变量’打了引号,因为它不是我们常说的全局变量,而是在闭包中的变量,它相对于闭包来说是全局变量。
    比如我们改变视窗大小的时候,我们更希望在视窗大小固定的时候再去执行某个方法。

    原理转换为代码
    function debounce(fn, delay) {
      var timer = 0
      var _delay = delay || 800
      return function() {
        if(timer) {
          clearTimeout(timer)
        }
        timer = setTimeout(() => {
          fn()
        }, _delay);
      }
    }
    
    • 以视窗大小改变来举例, 如果没有设置防抖
    function resize() {
      console.log('视窗改变时需要执行些什么...')
    }
    
    window.addEventListener('resize',resize)
    
    没有防抖
    • 如果加了防抖
    function debounce(fn, delay) {
      var timer = 0
      var _delay = delay || 800
      return function () {
        if (timer) {
          clearTimeout(timer)
        }
        timer = setTimeout(() => {
          fn()
        }, _delay);
      }
    }
    
    function resize() {
      console.log('视窗改变时需要执行些什么...')
    }
    
    window.addEventListener('resize', debounce(resize, 1000))
    
    设置了防抖

    对比非常明显,防抖在某些场景下,对性能优化非常大。如果是请求后端接口,防抖也可以减小服务器的压力。

    2.什么是节流

    相比防抖,节流的概念更通俗,节约流量。如果一个方法在短时间内疯狂执行,我们希望它每隔一段时间执行。节约一点流量嘛 嘻嘻

    原理转换为代码
    function throttle(fn, delay = 800) {
      var timer = 0
      var _delay = delay
      return function(){
        if(!timer) {
          setTimeout(() => {
            fn()
            timer = 0
          }, _delay);
        }
      }
    }
    
    • 以视窗大小改变举例
    function resize(n) {
      return function () {
        console.log('视窗改变时需要执行些什么...' + n++)
      }
    }
    window.addEventListener('resize', throttle(resize(1)))
    
    节流

    ·

    • 节流的应用场景:
      • 懒加载时请求数据

    总结

    防抖和节流还是看业务需求, 需求合适的话请尽情用 😉

    站在巨人的肩膀上,能看得更远。路漫漫其修远兮,吾将上下而求索。共勉

    相关文章

      网友评论

        本文标题:JS防抖和节流原理📝

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