JS 防抖和节流

JS 防抖和节流

防抖(debounce)和节流(throttle)都是用来控制函数执行频率的技术。

防抖

概述

防抖:指的是在函数被触发 n 毫秒之后运行,如果在这 n 毫秒内有其他的调用(即触发),则会重新计算函数的执行时间。防抖是在最后一次触发后的等待时间后执行函数。

场景

适用于输入框、滚动事件等,避免因频繁触发引起的函数重复执行和不必要的网络请求。

实现

防抖:可以通过 setTimeoutclearTimeout 实现,即设置定时器,等待一段时间 beforeTime 后才触发事件处理函数。如果在这段时间内再次触发了事件,则清除之前的定时器并重新设置定时器。只有在定时器到期后没有再次触发事件,事件处理函数才会被执行。

let input = document.querySelector("input");
let btn = document.querySelector("#btn");
const debounce = (() => {
    let timer = null;
    return (callback, time = 800) => {
        timer && clearTimeout(timer);
        timer = setTimeout(callback, time);
    };
})();

btn.addEventListener("click", function () {
    debounce(() => {
        console.log(input.value);
    }, 2000);
});

节流

概述

节流:指的是在限制被触发的频率,在 n 毫秒内只运行一次函数,而不是在调用过程中无限制地调用它。节流是在固定时间间隔内执行函数

场景

  • 防止按钮频繁点击。
  • 在页面无限加载场景下,每隔一段事件只能请求一次。

实现

节流:可以通过记录节流函数上一次执行时间的方式实现。在设定的时间间隔内,如果函数多次触发,则只执行一次函数。当第一次触发事件时,记录当前时间戳,之后每次触发事件都先检查当前时间和记录的时间间隔是否超过设定的时间间隔,如果超过,则执行事件处理函数并更新时间戳,否则忽略。

let input = document.querySelector("input");
let btn = document.querySelector("#btn");
const throttle = (() => {
    let last = 0;
    return (callback, time = 800) => {
        let now = +new Date();
        if (now - last > time) {
            callback();
            last = now;
        }
    };
})();

btn.addEventListener("click", function () {
    if (input.value == "") {
        return;
    }
    throttle(() => {
        console.log(input.value);
    }, 2000);
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值