当前位置:首页 > JavaScript

js实现阻隔

2026-01-31 18:31:28JavaScript

实现阻隔(防抖与节流)

防抖(Debounce)和节流(Throttle)是JavaScript中常用的阻隔技术,用于优化高频事件的性能。以下是具体实现方法:

防抖(Debounce)

防抖确保函数在连续触发时只执行最后一次,或在停止触发后延迟执行。

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

使用场景:

  • 搜索框输入联想
  • 窗口大小调整事件

示例调用:

js实现阻隔

const handleSearch = debounce(() => {
  console.log('执行搜索');
}, 500);

inputElement.addEventListener('input', handleSearch);

节流(Throttle)

节流确保函数在固定时间间隔内只执行一次。

function throttle(func, limit) {
  let lastFunc;
  let lastRan;
  return function(...args) {
    if (!lastRan) {
      func.apply(this, args);
      lastRan = Date.now();
    } else {
      clearTimeout(lastFunc);
      lastFunc = setTimeout(() => {
        if (Date.now() - lastRan >= limit) {
          func.apply(this, args);
          lastRan = Date.now();
        }
      }, limit - (Date.now() - lastRan));
    }
  };
}

使用场景:

js实现阻隔

  • 滚动事件监听
  • 游戏中的按键处理

示例调用:

const handleScroll = throttle(() => {
  console.log('处理滚动');
}, 200);

window.addEventListener('scroll', handleScroll);

注意事项

  1. 防抖适用于需要等待操作结束的场景,如输入完成
  2. 节流适用于需要均匀分配执行次数的场景,如动画渲染
  3. 时间参数需要根据实际场景调整
  4. 使用箭头函数时需注意this绑定问题

高级变体

立即执行的防抖版本:

function debounceImmediate(func, delay) {
  let timeoutId;
  return function(...args) {
    const callNow = !timeoutId;
    clearTimeout(timeoutId);
    timeoutId = setTimeout(() => {
      timeoutId = null;
    }, delay);
    if (callNow) func.apply(this, args);
  };
}

带取消功能的节流:

function cancellableThrottle(func, limit) {
  let lastRan;
  let timeoutId;
  const throttled = function(...args) {
    if (!lastRan || Date.now() - lastRan >= limit) {
      func.apply(this, args);
      lastRan = Date.now();
    } else {
      clearTimeout(timeoutId);
      timeoutId = setTimeout(() => {
        throttled.apply(this, args);
      }, limit - (Date.now() - lastRan));
    }
  };
  throttled.cancel = () => clearTimeout(timeoutId);
  return throttled;
}

标签: js
分享给朋友:

相关文章

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现轮播图

js实现轮播图

基础轮播图实现 使用HTML、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…