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

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

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含inpu…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…

js实现滚动

js实现滚动

实现滚动效果的方法 在JavaScript中实现滚动效果可以通过多种方式完成,以下是一些常见的方法: 使用window.scrollTo() window.scrollTo()方法可以将页面滚动到指…

js实现菜单

js实现菜单

实现基本HTML结构 使用HTML创建菜单的基本框架,通常包含<ul>和<li>元素。示例结构如下: <ul id="menu"> <li><…