首页 > 其他分享 >函数节流与函数防抖

函数节流与函数防抖

时间:2023-09-14 15:22:24浏览次数:25  
标签:防抖 函数 debounce callback 节流 wait

相关理解

  • 事件频繁触发可能造成的问题?
  1. 一些浏览器事件:window.onresize、window.mousemove等,触发的频率非常高,会造成界面卡顿
  2. 如果向后台发送请求,频繁触发,对服务器造成不必要的压力
  • 如何限制事件处理函数频繁调用
  1. 函数节流
  2. 函数防抖

函数节流(throttle)

  • 理解:
  1. 在函数需要频繁触发时: 函数执行一次后,只有大于设定的执行周期后才会执行第二次
  2. 适合多次事件按时间做平均分配触发
  • 场景:
  1. 窗口调整(resize)
  2. 页面滚动(scroll)
  3. DOM 元素的拖拽功能实现(mousemove)
  4. 抢购疯狂点击(click)

函数防抖(debounce)

  • 理解:
  1. 在函数需要频繁触发时: 在规定时间内,只让最后一次生效,前面的不生效。
  2. 适合多次事件一次响应的情况
  • 场景:
  1. 输入框实时搜索联想(keyup/input)
  • 区别函数节流与防抖

API说明

  • throttle() 节流
  1. 语法: throttle(callback, wait)
  2. 功能: 创建一个节流函数,在 wait 毫秒内最多执行 callback 一次
  • debounce() 防抖
  1. 语法: debounce(callback, wait)
  2. 功能: 创建一个防抖动函数,该函数会从上一次被调用后,延迟 wait 毫秒后调用 callback

代码实现

函数节流

/*
实现函数节流
- 语法:throttle(callback, wait)
- 功能:创建一个节流函数,在wait毫秒内最多执行'callback'一次
*/

export function throttle(callback, wait) {
    let start: number = 0
    // 返回一个事件监听函数(也就是节流函数)
    return function (event) {
        console.log('throttle event')
        // 只有当距离上次处理的时间间隔超过了wait时,才执行处理事件的函数
        const current = Date.now()
        if(current - start > wait){
            callback.call(this, event)  // 需要指定this和参数
            start = current
        }
    }
}

函数防抖

/*
实现函数防抖
- 语法:debounce(callback, wait)
- 功能:创建一个防抖动函数,该函数会从上一次被调用后,延迟`wait`毫秒后调用`callback`
*/

export function debounce(callbcak, wait){
    // 用来保存定时器任务的标识id
    let timeoutId = -1
    // 返回一个事件监听函数(也就是防抖函数)
    return function (event) {
        console.log('debounce event')
        // 清除未执行的定时器任务
        if(timeoutId!==-1){
            clearTimeout(timeoutId)
        }
        // 启动延迟 await 时间后执行的定时器任务
        timeoutId = setTimeout(() =>{
            // 调用callback处理时间
            callbcak.call(this, event)
            // 处理完后重置标识
            timeoutId = -1
        }, wait)
    }
}

测试

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>函数节流与防抖</title>
</head>
<body>

  <button id="handle">正常处理</button>
  <button id="throttle">测试函数节流</button>
  <button id="debounce">测试函数防抖</button>
  
  <script src="../dist/atguigu-utils.js"></script>
  <!-- <script src="../node_modules/atguigu-utils/dist/atguigu-utils.js"></script> -->
  <script>
    /* 处理点击事件的回调函数 */
    function handleClick(event) { // 处理事件的回调
      console.log('处理点击事件', this, event)
    }

    document.getElementById('handle').onclick = handleClick
    document.getElementById('throttle').onclick = aUtils.throttle(handleClick, 2000)
    document.getElementById('debounce').onclick = aUtils.debounce(handleClick, 2000)
  </script>

</body>
</html>

标签:防抖,函数,debounce,callback,节流,wait
From: https://www.cnblogs.com/bfyzzk/p/17697918.html

相关文章

  • 盘点6个应该掌握的Python内置函数!
    Python作为一种灵活而强大的编程语言,越来越多的工程师开始学习、使用它。今天给大家介绍6个常见的Python内置函数,希望大家能够掌握它,以下是详细的内容:1、len()函数len()命令是一种简单而不可或缺的机制,用于确定指定可迭代对象(如列表、元组或字符串)的大小(即组件的计......
  • SQL基础总结(四):操作符和函数
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------派生列是一个计算结果。派生列不会成为表中的永久列,他们用于显示或者报表目的。 包含空值的任何算数运算的......
  • 无涯教程-JavaScript - ISREF函数
    描述如果指定的值是参考,则ISREF函数返回逻辑值TRUE。否则返回FALSE。语法ISREF(value)争论Argument描述Required/OptionalvalueAreferencetoacell.RequiredNotes您可以在执行任何操作之前使用此功能测试单元格的内容。适用性Excel2007,Excel2010,Excel......
  • java 日期函数
    得到过去的时间:exampleone:privateDategetDateTime(){ Calendarcalendar=Calendar.getInstance(); calendar.set(2011,Calendar.DECEMBER,1,23,0,0); returncalendar.getTime();}exampletwo:String.valueOf(newDate().getTime()-2......
  • Z函数(扩展KMP)
    Z函数(扩展KMP)用于解决以下问题:给定一个长度为n的字符串\(s\),求出一个数组\(z\),其中\(z_i\)表示字符串\(s(0,n-1)\)和\(s(i,n-1)\)的最长公共前缀。其中\(|s|<=2\times10^7\)。假设当前已经求出了\(z_0\)到\(z_{i-1}\),下一个要求\(z_i\):设\(p\)为\(1\)到\(i-1\)......
  • 无涯教程-JavaScript - ISNONTEXT函数
    描述如果指定的值引用的不是文本,则ISNONTEXT函数将返回逻辑值TRUE。否则返回FALSE。如果该值引用空白单元格,则该函数返回TRUE。语法ISNONTEXT(value)争论Argument描述Required/OptionalvalueValueorexpressionorareferencetoacell.RequiredNotes您可以......
  • JS深入学习笔记 - 第一章.构造函数原型与原型链
    1.构造函数和原型 1.1概述在典型的 OOP语言中(如Java),都存在类的概念,类就是对象的模板,对象就是类的实例,但在ES6之前,JS并没有引入类的概念。在ES6之前,对象不是基于类创建的,而是一种称为构建函数的特殊函数来定义对象和它们的特征。有三种创建对象的方式:对象字面量(constob......
  • 农村高中生源转型期提升学生二次函数建模能力的课堂探究
        通过结合具体的数学问题,引导高中生深入分析问题,有效地构建求解问题的数学模型,可以使学生逐步掌握数学问题求解的基本思路以及模型建构的方法与注意事项。但是离开了反复训练,无法从根本上提升高中生的数学建模能力。因此,在平时的高中数学教学中,教师要注意结合数学教学的......
  • mysql函数
     https://www.jb51.net/article/256828.htm#_label19 ......
  • Python学习笔记-Python函数进阶
    函数多返回值思考如果一个函数有两个return,程序如何执行?例如:defreturn_num():return1return2result=return_num()print(result)上面代码只执行了第一个return,因为retrun可以退出当前函数,导致return下方的代码不执行。多个返回值如果一个函数要有多个返回值,书写方式示......