导读:本期聚焦于小伙伴创作的《JavaScript防抖节流怎么实现?JavaScript性能优化实战技巧有哪些?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《JavaScript防抖节流怎么实现?JavaScript性能优化实战技巧有哪些?》有用,将其分享出去将是对创作者最好的鼓励。

在JavaScript前端开发中,频繁触发的事件比如窗口滚动、输入框输入、按钮连续点击等,如果直接绑定处理函数,会导致函数在短时间内被大量调用,不仅浪费计算资源,还可能引发页面卡顿、接口重复请求等问题。防抖和节流就是专门用来解决这类问题的两种核心优化方案,通过控制函数的执行时机和频率,实现性能提升。

JavaScript防抖节流怎么实现?JavaScript性能优化实战技巧有哪些?

防抖的核心原理与实现

防抖的核心思想是:当函数被触发后,不立即执行,而是等待一段时间,如果在这段等待时间内函数再次被触发,就重新计时,直到等待时间结束且没有新的触发,才执行函数。简单来说就是触发频率越高,执行越靠后

基础防抖实现

基础防抖的实现逻辑是维护一个定时器,每次触发函数时先清除之前的定时器,再重新设置新的定时器,等待指定时间后执行目标函数。

/**
 * 基础防抖函数
 * @param {Function} fn 需要防抖的目标函数
 * @param {number} delay 防抖等待时间,单位毫秒
 * @returns {Function} 经过防抖处理的函数
 */
function debounce(fn, delay) {
  let timer = null;
  return function(...args) {
    // 清除之前的定时器
    if (timer) {
      clearTimeout(timer);
    }
    // 重新设置定时器
    timer = setTimeout(() => {
      fn.apply(this, args);
      timer = null;
    }, delay);
  };
}

带立即执行功能的防抖实现

有些场景下我们希望第一次触发函数时立即执行,之后在等待时间内再次触发则不执行,等待时间结束后才能再次触发执行,这就是带立即执行功能的防抖。

/**
 * 带立即执行功能的防抖函数
 * @param {Function} fn 需要防抖的目标函数
 * @param {number} delay 防抖等待时间,单位毫秒
 * @param {boolean} immediate 是否立即执行,默认false
 * @returns {Function} 经过防抖处理的函数
 */
function debounce(fn, delay, immediate = false) {
  let timer = null;
  return function(...args) {
    if (timer) {
      clearTimeout(timer);
    }
    if (immediate) {
      // 判断是否已经有等待执行的定时器,没有则立即执行
      const canExecute = !timer;
      timer = setTimeout(() => {
        timer = null;
      }, delay);
      if (canExecute) {
        fn.apply(this, args);
      }
    } else {
      timer = setTimeout(() => {
        fn.apply(this, args);
        timer = null;
      }, delay);
    }
  };
}

节流的核心原理与实现

节流的核心思想是:在指定时间内,函数只能执行一次,无论触发多少次,只要时间没到,就不会执行,时间到了就执行一次,然后重新计时。简单来说就是固定时间内只执行一次

时间戳版节流实现

时间戳版节流通过记录上一次执行的时间,每次触发时判断当前时间和上一次执行时间的差值是否大于等于等待时间,满足则执行函数并更新上一次执行时间。

/**
 * 时间戳版节流函数
 * @param {Function} fn 需要节流的目标函数
 * @param {number} delay 节流间隔时间,单位毫秒
 * @returns {Function} 经过节流处理的函数
 */
function throttle(fn, delay) {
  let lastTime = 0;
  return function(...args) {
    const currentTime = Date.now();
    // 判断当前时间和上一次执行时间的差值是否大于等于等待时间
    if (currentTime - lastTime >= delay) {
      fn.apply(this, args);
      lastTime = currentTime;
    }
  };
}

定时器版节流实现

定时器版节流通过维护一个定时器,每次触发时如果定时器不存在就设置定时器,定时器到期后执行函数并清除定时器,等待下一次触发。

/**
 * 定时器版节流函数
 * @param {Function} fn 需要节流的目标函数
 * @param {number} delay 节流间隔时间,单位毫秒
 * @returns {Function} 经过节流处理的函数
 */
function throttle(fn, delay) {
  let timer = null;
  return function(...args) {
    if (!timer) {
      timer = setTimeout(() => {
        fn.apply(this, args);
        timer = null;
      }, delay);
    }
  };
}

防抖和节流的实际应用场景

两者的适用场景有明显区别,开发者需要根据实际需求选择:

  • 防抖适用场景:输入框搜索联想、表单输入验证、窗口resize事件处理、按钮点击防止重复提交等。比如搜索输入框,用户连续输入时不需要每次输入都请求接口,等用户停止输入一段时间后再请求,减少接口调用次数。
  • 节流适用场景:页面滚动加载更多、鼠标移动事件、窗口滚动监听导航栏高亮、拖拽事件等。比如页面滚动时,不需要每次滚动都计算位置,每隔固定时间计算一次即可,避免频繁计算导致的性能问题。

注意事项

在使用防抖和节流时,需要注意以下几点:

  • 防抖和节流返回的都是新函数,如果需要取消绑定的事件,要保存返回的函数引用,不能直接使用原函数。
  • 如果防抖和节流函数需要传递事件对象,要注意apply或者call的正确使用,保证事件对象的正常传递。
  • 等待时间的选择要根据实际场景调整,时间太短起不到优化效果,时间太长会影响用户体验。

防抖和节流是JavaScript性能优化中非常实用的技巧,理解两者的核心原理和适用场景,能够帮助开发者更合理地控制函数执行频率,提升前端应用的性能和用户体验。

JavaScript防抖节流性能优化debounce_throttle修改时间:2026-07-22 06:51:24

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。