问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

JS如何实现防抖和节流

创作时间:
作者:
@小白创作中心

JS如何实现防抖和节流

引用
1
来源
1.
https://docs.pingcode.com/baike/2344538

防抖节流,是前端开发中常见的两种优化技术,可以用来控制函数执行的频率,从而提高性能和用户体验。防抖是指在事件触发后等待一段时间,如果在这段时间内事件再次触发,则重新计时;节流则是在指定的时间间隔内,只允许函数执行一次。具体来说,防抖适用于避免短时间内多次触发的情况,如搜索框输入联想;节流适用于控制频繁触发的情况,如滚动事件或窗口大小调整。

一、防抖

防抖(Debouncing)主要用于减少函数的执行次数,通过延迟函数的执行时间,避免在短时间内多次触发。

1、基本原理

防抖的基本原理是在事件被触发后,设定一个延迟时间,如果在延迟时间内事件再次触发,则重新计时。只有当延迟时间过去且没有再次触发事件时,函数才会被执行。

2、实现方式

使用JavaScript实现防抖,可以通过设置一个定时器来实现:

function debounce(func, wait) {
    let timeout;
    return function(...args) {
        const context = this;
        clearTimeout(timeout);
        timeout = setTimeout(() => func.apply(context, args), wait);
    };
}

这是一个简单的防抖函数debounce,它接受一个函数func和延迟时间wait作为参数。每次事件触发时,都会清除之前的定时器,并重新设置一个新的定时器。只有当延迟时间过去且没有再次触发事件时,func才会被执行。

3、应用场景

防抖主要用于避免短时间内多次触发的情况,以下是一些常见的应用场景:

  • 输入框搜索:用户在输入框中输入内容时,实时向服务器请求数据。使用防抖可以避免每次输入都向服务器发送请求,减少服务器负担。
  • 窗口大小调整:用户调整浏览器窗口大小时,防止频繁触发调整事件。
  • 按钮点击:防止用户在短时间内多次点击按钮导致的重复操作。

二、节流

节流(Throttling)主要用于控制函数的执行频率,通过限制函数在指定时间间隔内只能执行一次。

1、基本原理

节流的基本原理是在指定时间间隔内,只允许函数执行一次。如果在时间间隔内再次触发事件,则忽略此次触发。

2、实现方式

使用JavaScript实现节流,可以通过设置一个标志位来实现:

function throttle(func, wait) {
    let lastTime = 0;
    return function(...args) {
        const now = new Date().getTime();
        if (now - lastTime >= wait) {
            lastTime = now;
            func.apply(this, args);
        }
    };
}

这是一个简单的节流函数throttle,它接受一个函数func和时间间隔wait作为参数。每次事件触发时,会检查当前时间和上次执行时间的差值。如果差值大于或等于wait,则执行func,并更新上次执行时间。

3、应用场景

节流主要用于控制频繁触发的情况,以下是一些常见的应用场景:

  • 滚动事件:用户滚动页面时,防止频繁触发滚动事件。
  • 窗口大小调整:用户调整浏览器窗口大小时,防止频繁触发调整事件。
  • 按钮点击:防止用户在短时间内多次点击按钮导致的重复操作。

三、防抖与节流的比较

防抖和节流都是为了优化函数的执行频率,但它们的应用场景和实现方式有所不同:

  • 防抖:适用于避免短时间内多次触发的情况,通过延迟函数的执行时间,只有在延迟时间过去且没有再次触发事件时,函数才会被执行。
  • 节流:适用于控制频繁触发的情况,通过限制函数在指定时间间隔内只能执行一次。

四、结合使用防抖和节流

在实际开发中,有时需要结合使用防抖和节流来实现更复杂的需求。例如,在一个搜索框中,用户输入时可以使用防抖来减少请求次数,但在用户停止输入后的一段时间内,还需要执行最后一次请求。这时可以结合使用防抖和节流来实现:

function debounceThrottle(func, wait, immediate) {
    let timeout, lastTime = 0;
    return function(...args) {
        const now = new Date().getTime();
        const context = this;
        if (immediate && !timeout) {
            func.apply(context, args);
        }
        clearTimeout(timeout);
        if (now - lastTime >= wait) {
            lastTime = now;
            func.apply(context, args);
        } else {
            timeout = setTimeout(() => {
                lastTime = now;
                if (!immediate) {
                    func.apply(context, args);
                }
            }, wait);
        }
    };
}

这个函数debounceThrottle结合了防抖和节流的特点,接受一个函数func、时间间隔wait和一个布尔值immediate作为参数。immediate用于控制函数是否立即执行。每次事件触发时,会检查当前时间和上次执行时间的差值。如果差值大于或等于wait,则执行func,并更新上次执行时间。如果差值小于wait,则设置一个定时器,在延迟时间过去后执行func

五、总结

防抖节流是前端开发中常用的优化技术,可以用来控制函数的执行频率,从而提高性能和用户体验。防抖适用于避免短时间内多次触发的情况,通过延迟函数的执行时间,只有在延迟时间过去且没有再次触发事件时,函数才会被执行。节流适用于控制频繁触发的情况,通过限制函数在指定时间间隔内只能执行一次。在实际开发中,可以根据具体需求选择使用防抖或节流,甚至结合使用。掌握防抖和节流的实现方式和应用场景,可以有效地提高前端应用的性能和用户体验。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号