当前位置:首页 > 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实现分页

实现分页的基本思路 分页功能通常需要处理数据分割、页码生成和用户交互。核心逻辑包括计算总页数、根据当前页截取数据、渲染页码按钮等。 前端分页实现(静态数据) 假设已有全部数据,仅需前端分页展示:…

js实现轮播图

js实现轮播图

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

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previ…

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Paren…