JS 防抖与节流

简介: 防抖和节流是优化高频事件处理的技术。针对如`scroll`、`resize`等频繁触发的事件,它们能有效减少不必要的回调执行,节省资源。防抖确保在一段时间内仅执行最后一次操作,适用于输入框自动补全等场景;而节流则按固定间隔执行函数,适合拖拽、滚动事件。通过简单的JavaScript实现,可以显著提升应用性能和用户体验。

一、是什么

本质上是优化高频率执行代码的一种手段

如:浏览器的 resizescrollkeypressmousemove 等事件在触发时,会不断地调用绑定在事件上的回调函数,极大地浪费资源,降低前端性能

为了优化体验,需要对这类事件进行调用次数的限制,对此我们就可以采用 防抖(debounce)节流(throttle) 的方式来减少调用频率

二. 区别以及共同点

JS 防抖与节流

共同点 区别 应用场景
防抖 debounce 在事件频繁被触发的时候 只执行最后一次 input输入
节流 throttle 减少事件执行的次数 有规律的执行 拖拽,Scroll

三. 代码实现

防抖方法的实现

let input = document.querySelector('input')
        input.addEventListener('keyup', debounce(function () {
   
   
            console.log(input.value, '向后台取数据');
        })
        )
        // 手写一个防抖函数来解决重复请求后台服务器的问题
        function debounce(fn) {
   
   
            let timer = null;

            return function () {
   
   
                if (timer) clearTimeout(timer)

                timer = setTimeout(() => {
   
   
                    fn.apply(this, arguments)
                    timer = null;
                }, 1000)
            }
        }

上面代码的意思是:

找到页面中第一个input 元素,添加一个 "keyup" 事件监听器,当用户输入内容时,使用防抖函数 debounce来限制事件的触发频率,每次事件最多只被触发一次

防抖函数返回一个新函数,该函数会在一定时间内(这里是 1000 毫秒)不执行,在该时间内如果再次触发了该事件,会清除之前的计时器并重新设置计时器。当计时器结束后,才会执行传入的函数并向后台服务器请求数据,同时将 input 元素的值作为参数进行输出。

这样可以防止用户输入过快或者频率过高,导致向后台服务器发送重复的请求

节流函数代码的实现

   let box = document.querySelector('.box')
        box.addEventListener('drag', throttle(function (e) {
   
   
            console.log(e.clientX);
        }))

        function throttle(fn) {
   
   
            let timer = null;
            return function () {
   
   
                if (timer) return
                timer = setTimeout(() => {
   
   
                    fn.apply(this, arguments)
                    timer = null
                }, 100)
            }
        }

上面代码的意思:
找到页面中 class 为 "box"的元素,添加一个 "drag" 鼠标拖拽 事件监听器,当用户拖动该元素时,使用节流函数 throttle 来限制事件的触发频率每100毫秒触发一次事件,并在控制台输出鼠标的 x 坐标值。其中 throttle 函数返回一个新函数,该函数在 timer 计时器未结束时不会执行,从而实现了事件的节流

四. 防抖效果图展示(前后对比)

没有加防抖函数之间
12.jpg

加了防抖函数之后

13.jpg

节流效果图展示(前后对比)

没有加节流函数之间
14.jpg

加了节流函数之后
15.jpg

五.总结

防抖函数的作用是在用户停止触发事件后,延迟一段时间再执行函数。这样可以避免频繁地执行一些计算量大或者请求量大的函数,比如自动保存、搜索建议等。

节流函数的作用是在一定时间间隔内,只执行一次函数。这样可以保证函数的执行速度不超过设定的频率,比如滚动事件、窗口大小调整等。

防抖和节流函数的好处是可以提高性能,减少资源消耗,优化用户体验。

目录
相关文章
|
2月前
|
前端开发 JavaScript UED
JavaScript防抖和节流的使用及区别
JavaScript防抖和节流的使用及区别
105 57
|
5月前
|
前端开发 JavaScript Java
【JavaScript】JavaScript 防抖与节流:以游戏智慧解锁实战奥秘
【JavaScript】JavaScript 防抖与节流:以游戏智慧解锁实战奥秘
62 3
|
5月前
|
JavaScript 前端开发 UED
深入理解JavaScript中的节流与防抖技术
理解并合理运用节流与防抖技术,可以帮助我们优化事件处理函数的执行频率,从而提升应用的性能和用户体验。这两种技术通过减少不必要的计算和DOM操作,使得Web应用程序能够更加流畅地运行。 通过掌握防抖和节流的实现原理及应用场景,开发者可以更加灵活地编写高效且性能优化的代码,对于面对高频事件处理时尤其重要。在开发中合理选择使用防抖或节流,将直接影响到应用的响应性和效率。
56 1
|
1月前
|
前端开发 JavaScript UED
JavaScript 中的函数防抖与节流详解及实用场景
在前端开发中,处理用户频繁触发的事件,如输入框的输入、按钮点击、窗口调整大小等,常常需要优化性能以减少无效操作。为此,函数防抖(debounce)和函数节流(throttle)是两种常见的性能优化手段。本文将详细介绍两者的区别与实现,并探讨它们的应用场景。
36 1
|
2月前
|
JavaScript 前端开发
js防抖函数返回值问题解决方案
本文介绍了如何在JavaScript中创建一个带有返回值的防抖函数,通过结合Promise来实现。这种防抖函数可以在事件触发一定时间后再执行函数,并能处理异步操作的返回值。文章提供了防抖函数的实现代码和如何在实际项目中使用该防抖函数的示例。
31 1
|
6月前
|
JavaScript 前端开发 UED
js的防抖节流
js的防抖节流
36 1
|
6月前
|
JavaScript 前端开发 UED
js的节流
js的节流
32 0
|
6月前
|
测试技术
js_防抖与节流(闭包的使用)
js_防抖与节流(闭包的使用)
44 0
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
96 2
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的小区物流配送系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的小区物流配送系统附带文章源码部署视频讲解等
123 4