JavaScript防抖与节流的原理及实现详解

作者:闭包旅人

时间:2026-10-24

浏览:511

本文深入解析JavaScript中防抖(debounce)与节流(throttle)的核心原理。通过对比两者在高频事件触发下的不同表现,结合输入框搜索建议、鼠标跟随等实际案例,详细展示了基于定时器、缓存对象及节流阀的具体实现方式,旨在帮助开发者有效优化前端性能,降低服务器压力与CPU资源消耗。

文章目录

1. 防抖机制定义

【原理】:防抖(debounce)指事件触发后延迟 n 秒执行回调,若 n 秒内再次触发则重置计时器。

【示意图】:

1. 防抖机制定义

【核心价值】:

用户高频触发事件时,仅执行最后一次请求,以节省网络资源。

【输入框防抖实现】:

var timer = null                    // 1. 防抖动的 timer
 function debounceSearch(keywords) { // 2. 定义防抖的函数
    timer = setTimeout(function() {
    // 发起 JSONP 请求
    getSuggestList(keywords)
    }, 500)
 }
 $('#ipt').on('keyup', function() {  // 3. 在触发 keyup 事件时,立即清空 timer
    clearTimeout(timer)
    // ...省略其他代码
    debounceSearch(keywords)
 })

【建议框缓存机制】:

声明全局缓存对象

  // 缓存对象
  var cacheObj = {}

将查询结果存储至缓存对象

 // 渲染建议列表
 function renderSuggestList(res) {
    // ...省略其他代码
   // 将搜索的结果,添加到缓存对象中
    var k = $('#ipt').val().trim()
    cacheObj[k] = res
 }

优先从缓存读取搜索建议

 // 监听文本框的 keyup 事件
 $('#ipt').on('keyup', function() {
    // ...省略其他代码
    // 优先从缓存中获取搜索建议
    if (cacheObj[keywords]) {
       return renderSuggestList(cacheObj[keywords])
    }
    // 获取搜索建议列表
    debounceSearch(keywords)
  })

2、节流机制定义

【原理】:限制单位时间内事件触发的频率,即节流策略。

【示意图】:

1. 防抖机制定义

【应用场景】

  • 鼠标连续触发事件(如点击),确保单位时间内仅执行一次;
  • 懒加载监听滚动位置时,无需每次滑动都触发,可降低计算频率,避免浪费 CPU 资源;

【鼠标跟随案例】:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <script src="./lib/jquery.js"></script>
  <style>
    html,
    body {
      margin: 0;
      padding: 0;
      overflow: hidden;
    }
    #angel {
      position: absolute;
    }
  </style>
</head>
<body>
  <img src="./angel.gif" alt="" id="angel" />
  <script>
    $(function () {
      // 获取图片元素
      var angel = $('#angel')
      // 绑定鼠标移动事件
      $(document).on('mousemove', function (e) {
        // 获取鼠标到x和y轴的距离设置给图片的高和左
        $(angel).css('top', e.pageY-40 + 'px').css('left', e.pageX-40 + 'px')
      })
    })
  </script>
</body>
</html>

3、节流阀机制

【原理】:

  • 节流阀为空时,允许执行下一次操作;非空时,禁止执行。
  • 当前操作完成后,必须重置节流阀为空,以允许后续操作。
  • 每次执行前,需校验节流阀状态是否为空。

【节流优化应用】:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <script src="./lib/jquery.js"></script>
  <style>
    html,
    body {
      margin: 0;
      padding: 0;
      overflow: hidden;
    }
    #angel {
      position: absolute;
    }
  </style>
</head>
<body>
  <img src="./angel.gif" alt="" id="angel" />
  <script>
    $(function () {
      // 定义一个节流阀
      var timer = null;
      // 获取图片元素
      var angel = $('#angel')
      // 绑定鼠标移动事件
      $(document).on('mousemove', function (e) {
        // 判断节流阀是否为空
        if (timer) return
        // 控制节流阀的时间
        timer = setTimeout(function () {
          // 获取鼠标到x和y轴的距离设置给图片的高和左
          $(angel).css('top', e.pageY - 40 + 'px').css('left', e.pageX - 40 + 'px')
          // 清空节流阀
          timer = null
        }, 100)
      })
    })
  </script>
</body>
</html>

总结

本文到此结束,希望能提供有益帮助,欢迎持续关注本站更多内容!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章