美文网首页
节流和防抖

节流和防抖

作者: A郑家庆 | 来源:发表于2021-06-08 15:03 被阅读0次

前言

当某个事件在短时间内被高频触发的时候,比如用户短时间多次点赞取消点赞、输入框查询数据、监听页面滚动等,触发的频率非常高,会对服务器或者浏览器性能造成压力,如果碰到这些问题,那就需要考虑用到节流和防抖了.

节流(throttle)

定义:在规定时间内,只让函数触发的第一次生效,后面不生效,超过规定时间才会执行第二次

实现原理

执行js函数,然后记录上次执行时间戳,再次执行js函数的时候判断一下当前时间戳距离上次时间戳是否超过规定时间,如果是则执行,并更新上次时间戳,如此循环:

function throttle(fn, delay) {
  // 记录上次执行时间戳
  let lastTime = 0
  return function () {
     // 记录当前函数触发的时间
     let nowTime = Date.now()
     if (nowTime - lastTime > delay) {
         // 修改this的指向问题
         fn.call(this)
         // 更新时间戳
         lastTime = nowTime
     }
  }
}

document.onscroll = throttle(function() { console.log('scroll事件被触发了' + Date.now()) }, 200)
68747470733a2f2f757365722d676f6c642d63646e2e786974752e696f2f323031382f31312f32312f313637333638323463666336393437643f773d34383626683d32383326663d67696626733d3732363137.gif

上面例子中使用了闭包的特性,可以使变量lastTime的值长期保存在内存中.

应用场景
  • 多次点击提交、点赞取消点赞频繁切换
  • DOM元素的拖拽功能实现
  • 计算鼠标移动的距离
  • Canvas 模拟画板功能
  • 射击游戏的 mousedown/keydown 事件(单位时间只能发射一颗子弹)
  • 监听滚动事件判断是否到页面底部自动加载更多:给 scroll 加了 debounce 后,只有用户停止滚动后,才会判断是否到了页面底部;如果是 throttle 的话,只要页面滚动就会间隔一段时间判断一次

防抖

定义:在规定时间内,只让函数触发的最后一次生效,前面不生效

实现原理

第一次调用函数,创建一个定时器,在指定的时间间隔之后运行代码,在规定时间内多次触发这个方法,后一次调用函数的时候都会先清除上一次的定时器并新建一个,然后在规定时间内运行.

function debounce(fn, delay) {
    // 记录上一次的延时器
   var timer = null;
    return function() {
    // 清除上一次延时器
    clearTimeout(timer)
    timer = setTimeout(function() {
            fn.apply(this)
        }, delay)
    }
}
document.getElementById('btn').onclick = debounce(function() {
    console.log('点击事件被触发' + Date.now())
}, 1000)
68747470733a2f2f757365722d676f6c642d63646e2e786974752e696f2f323031382f31312f32312f313637333661353432636131373039393f773d36363726683d31363026663d67696626733d3738323031.gif

上例中也用到了闭包的特性,可以使变量timer的值长期保存在内存中.

应用场景
  • 每次 resize/scroll 触发统计事件
  • 文本输入的验证(连续输入文字后发送 AJAX 请求进行验证,验证一次就好)
  • 输入框输入查询数据

总结:节流和防抖的核心其实就是限制某一个方法被频繁触发,节流是执行第一次,超过规定时间执行第二次,防抖是在规定时间执行最后一次

相关文章

  • 谈谈js中的节流和防抖函数

    关于节流和防抖,这篇文章说的很好了,深入lodash源码分析防抖和节流深入篇 | Lodash 防抖和节流是怎么实...

  • JavaScript防抖和节流

    1. 认识防抖和节流 1.1. 对防抖和节流的认识 防抖和节流的概念其实最早并不是出现在软件工程中,防抖是出现在电...

  • 前端性能优化-浅谈js防抖和节流

    浅谈js防抖和节流

  • Javascript 基础

    1、函数防抖和函数节流 【《javascript高级程序设计》里,函数节流是这里讲的函数防抖。】函数防抖: 在事件...

  • js 防抖 节流

    节流 防抖1 防抖2

  • 2019-03-27

    js的防抖和节流 据我所知防抖和节流都是为了优化作用,减轻浏览器和服务端的负担,防抖和节流俩个的英文要记住: de...

  • js的防抖和节流

    js的 防抖(debounce)和 节流(throttle ) 防抖和节流一般用于高频触发事件,属于浏览器性能优化...

  • 手写防抖和节流函数实现

    1. 认识防抖和节流函数 防抖和节流的概念其实最早并不是出现在软件工程中,防抖是出现在电子元件中,节流出现在流体流...

  • 实现防抖和节流

    一、认识防抖和节流函数 防抖和节流的概念其实最早并不是出现在软件工程中,防抖是出现在电子元件中,节流出现在流体流动...

  • 2019-04-24关于节流和防抖

    节流: 应用场景: 防抖: 应用场景: 1.节流 2.防抖

网友评论

      本文标题:节流和防抖

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