一文搞懂防抖和节流

Posted 工程师-小白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文搞懂防抖和节流相关的知识,希望对你有一定的参考价值。

一文搞懂防抖和节流


在了解防抖和节流之前,首先要熟悉闭包的概念,因为防抖和节流函数就是使用闭包写的

闭包

作用域链

Es6新推出了块级作用域的概念,就是大括号里面的变量都是属于这个块级作用域的,也就是说在这个大括号外面是访问不到里面的变量的,里面的变量只能用const或者let来定义,如果是用var是没有块级作用域的概念的,大括号外面也可以访问到变量
作用域链的概念:就是在函数内部是可以访问到全局变量的,函数在寻找变量的时候会顺着作用域链逐渐往上寻找
在这里插入图片描述

闭包

闭包就是能够得到其他函数中内部变量的函数,只要把这个函数返回出来就可以了,

本质上:闭包是将函数内部和函数外部连接起来的桥梁

作用:一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中

function init() {
    var name = "Mozilla"; // name 是一个被 init 创建的局部变量
    function displayName() { // displayName() 是内部函数,一个闭包
        alert(name); // 使用了父函数中声明的变量
    }
    displayName();
}

防抖

防抖:触发事件一段时间后才执行函数,如果在这段时间内被再次触发,则会重新计时,比如说点击确认键,在点击完成之后第二次不会让立马点击,会间隔一段时间之后才能允许再次点击 主要使用setTimeout和ClearTimeout 防抖函数主要分为两种,一种是延时执行防抖函数,另外一种是立即执行防抖函数

  • 延时执行防抖函数: 类似于电梯门,电梯门不关(一定时间内delay)一直来人,就一直在这等着,一直等到这段时间内 没人了,就管电梯门
function debounce_delay (fn, delay) {
  // 下面这句话只在生命的时候调用一次
  var timer = null //因为下面是返回一个函数,所以在调用这个函数的时候,要定义一个进行接受,这样接收到的就是这个回调函数,所以该条语句只执行一次
  return function () {
    if (timer) {
      clearTimeout(timer)
    }
    timer = setTimeout(() => {
      fn()
    }, delay)
  }
}
//调用时 
d1.onmousemove = debounce_delay(change, 1000) //不能直接debounce()这样调用,因为 里面return了一个函数,需要接受
  • 立即执行防抖函数: 类似于上电梯最后一个人 这个人一进电梯门 就走了,在电梯升高的这段时间(delay) 来乘坐电梯的其他人 要等到 电梯下来 直到装满(下一次请求到来)才能上去
function debounce_immediately (fn, delay) {
  var timer = null
  return function () {
    if (timer == null) fn()
    else {
      clearTimeout(timer)
    }
    timer = setTimeout(() => {
      timer = null
    }, delay)
  }
}

以上是关于一文搞懂防抖和节流的主要内容,如果未能解决你的问题,请参考以下文章

一文搞懂防抖和节流

一文读懂函数的防抖和节流

JavaScript中的节流与防抖函数记不住?我的答案保你终身难忘一小时搞懂,建议收藏

JavaScript中的节流与防抖函数记不住?我的答案保你终身难忘一小时搞懂,建议收藏

防抖和节流

来聊聊JavaScript中的防抖和节流