当前位置:首页 > JavaScript

JS节流和防抖的实现

2026-01-31 10:10:20JavaScript

节流(Throttle)的实现

节流是指在一定时间间隔内,函数最多执行一次。常用于限制高频事件的触发频率,如滚动事件、窗口调整等。

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

使用时间戳实现,确保在延迟时间内不会重复执行。最后一次调用如果在时间间隔内会被忽略。

定时器版本实现:

JS节流和防抖的实现

function throttle(func, delay) {
  let timer = null;
  return function(...args) {
    if (!timer) {
      timer = setTimeout(() => {
        func.apply(this, args);
        timer = null;
      }, delay);
    }
  };
}

防抖(Debounce)的实现

防抖是指触发高频事件后,函数在指定延迟后执行,若在延迟期间再次触发则重新计时。常用于输入框实时搜索。

function debounce(func, delay) {
  let timer;
  return function(...args) {
    clearTimeout(timer);
    timer = setTimeout(() => {
      func.apply(this, args);
    }, delay);
  };
}

基础版本会在延迟结束时执行最后一次调用。如果需要立即执行第一次调用,后续延迟可采用以下实现:

JS节流和防抖的实现

function debounce(func, delay, immediate) {
  let timer;
  return function(...args) {
    if (timer) clearTimeout(timer);
    if (immediate && !timer) {
      func.apply(this, args);
    }
    timer = setTimeout(() => {
      timer = null;
      if (!immediate) func.apply(this, args);
    }, delay);
  };
}

差异与应用场景

节流保证在固定间隔执行,适用于连续触发但需要均匀执行的情况,如滚动加载。

防抖在连续触发后只执行一次,适用于高频触发但只需最终结果的场景,如搜索框输入联想。

两者均可通过闭包保存状态,核心区别在于时间控制逻辑:节流是“固定周期”,防抖是“重置延迟”。

标签: 防抖JS
分享给朋友:

相关文章

vue如何实现防抖

vue如何实现防抖

Vue 防抖的实现方法 在Vue中实现防抖(debounce)可以通过以下几种方式,根据不同的使用场景选择合适的方法。 使用 Lodash 的 debounce 函数 Lodash 是一个流行的 J…

js中防抖和节流实现

js中防抖和节流实现

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟期间再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce(func…

JS实现一个并发函数

JS实现一个并发函数

实现并发控制的几种方法 在JavaScript中实现并发控制可以通过多种方式,以下是几种常见的方法: Promise.all 使用Promise.all可以并行执行多个异步任务,等待所有任务完成后再…

实现 slice JS

实现 slice JS

实现 JavaScript 的 slice 方法 JavaScript 的 slice 方法用于从数组或字符串中提取一部分,返回一个新的数组或字符串,而不修改原始数据。以下是实现 slice 的核心逻…

JS实现ln

JS实现ln

在JavaScript中实现自然对数(ln)功能可以通过以下几种方式完成: 使用Math对象的原生方法 JavaScript内置的Math对象提供了Math.log()方法,该方法默认计算以…