IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> javascript性能优化之防抖和节流【附源码】 -> 正文阅读

[JavaScript知识库]javascript性能优化之防抖和节流【附源码】

防抖debounce

连续的多次动作内,只执行最后一次动作

?? 设想下面场景:

  • 有一个提交按钮,每次点击提交之后,就会向后台发起ajax请求

  • 这样设计会有问题:用户在一定时间内多次点击提交,按钮就会像多次向后台发送请求!!

  • 这时候,防抖就非常有用:用户在一定时间内无论多点击多少次提交,按钮只会提交一次

🔑 防抖有两种执行模式:

  1. 在一定动作内执行最后一次动作

  2. 在一定动作内只执行首次动作

    在这里插入图片描述

    流程图地址:https://processon.com/diagraming/6162fee37d9c0866512e839d

    // 防抖函数
    function debounce(func, wait = 300, immediately) {
      let timer, result // timer为定时器,result为传入的函数的返回值
    
      let debounce = function (...args) {
        // 清楚定时器
        if (timer) clearTimeout(timer)
        // 是否立即执行事件
        if (immediately) {
          let callNow = !timer	// 判断是否有无定时器
          timer = setTimeout(() => {
            timer = null	// 把定时器变量清空
          }, wait)
    
          if (callNow) result = func.apply(this, args)
        } else {
          new Promise((resolve, reject) => {
            timer = setTimeout(() => {
              resolve(func.apply(this, args))
              timer = null
            }, wait)
          })
        }
        return result	// 返回值
      }
    
      // 终止防抖事件
      debounce.cancel = function () {
        clearTimeout(timer)
        timer = null
      }
    
      // 返回
      return debounce
    }
    

🏰 案例

应用场景:

  1. scroll事件滚动触发
  2. 搜索框输入查询
  3. 表单验证
  4. 按钮提交事件
  5. 浏览器窗口缩放,resize事件

-节流throttle

连续的多次动作内,在固定周期内,一个周期执行一次动作

?? 还是举一个例子:

  • 我现在有一个图片预览网站,里面有很多图片,需求是实现图片懒加载的监听
  • 这里的问题是:每次拉动滚动条,就会触发事件去对比图片是否到达可视区域,触发非常频繁
  • 这时候,节流就非常有用:在用户拉动滚动条的时候,我只在500ms这个周期内触发事件

🔑 节流有两种执行模式:

  1. 刚触发事件时会执行一次,后续周期会触发事件,最后一次事件不触发(顾头不顾尾)

  2. 刚触发事件时不执行,后续周期会触发事件,最后一次事件会触发(顾尾不顾头)

  3. 刚触发事件时会执行一次,后续周期会触发事件,最后一次事件会触发(顾头顾尾)

    在这里插入图片描述

    流程图地址:https://processon.com/diagraming/6163d0bae0b34d7c7da62cba

    function throttle(func, wait, opt = {leading: true, trailing: true}) {
      let timer, // 定时器
          old = 0 // 时间戳
    
      return function (...args) {
        let now = new Date().valueOf()
        let later = () => {
          old = new Date().valueOf() // 更新时间戳
          func.apply(this, args)
          timer = null
        }
    
        if(opt.leading === false) old = now  // leading=false 永远不执行第一次
    
        if (now - old > wait) {
          if (timer) {
            clearTimeout(timer) // 下面的定时器时间是不准的,有可能这个执行快
            timer = null
          }
          func.apply(this, args)
          old = now
        } else if (!timer && opt.trailing !== false) {
          timer = setTimeout(later, wait)
        }
      }
    }
    

🏰 案例

  • DOM元素拖拽
  • 飞机每隔一段事件射击导弹
  • 监听scroll滚动事件
  • 计算鼠标移动的距离
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-12 23:20:30  更:2021-10-12 23:21:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 22:40:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码