当前位置:首页 > JavaScript

js节流实现

2026-04-03 20:42:45JavaScript

节流的基本概念

节流(Throttle)是一种限制函数执行频率的技术,确保函数在指定时间间隔内最多执行一次。常用于高频事件(如滚动、输入、窗口调整等)的性能优化。

时间戳实现方式

通过比较当前时间与上次执行时间戳,决定是否触发函数。

function throttle(func, delay) {
    let lastTime = 0;
    return function(...args) {
        const now = Date.now();
        if (now - lastTime >= delay) {
            func.apply(this, args);
            lastTime = now;
        }
    };
}

特点

  • 首次触发立即执行(时间差为0)。
  • 最后一次触发可能不执行(若时间间隔未达到)。

定时器实现方式

通过定时器控制函数执行,确保延迟时间内仅触发一次。

function throttle(func, delay) {
    let timer = null;
    return function(...args) {
        if (!timer) {
            timer = setTimeout(() => {
                func.apply(this, args);
                timer = null;
            }, delay);
        }
    };
}

特点

  • 首次触发延迟执行(需等待定时器)。
  • 最后一次触发会延迟执行(定时器结束后执行)。

结合时间戳与定时器

结合两种方式,确保首次和最后一次均能触发。

function throttle(func, delay) {
    let lastTime = 0;
    let timer = null;
    return function(...args) {
        const now = Date.now();
        const remaining = delay - (now - lastTime);
        if (remaining <= 0) {
            if (timer) {
                clearTimeout(timer);
                timer = null;
            }
            func.apply(this, args);
            lastTime = now;
        } else if (!timer) {
            timer = setTimeout(() => {
                func.apply(this, args);
                lastTime = Date.now();
                timer = null;
            }, remaining);
        }
    };
}

特点

  • 首次触发立即执行。
  • 最后一次触发延迟执行(剩余时间内)。

应用示例

监听滚动事件并使用节流优化:

js节流实现

const handleScroll = throttle(() => {
    console.log('Scroll event throttled');
}, 200);

window.addEventListener('scroll', handleScroll);

注意事项

  • this 绑定:确保函数内 this 正确指向,通过 apply 或箭头函数处理。
  • 参数传递:使用剩余参数(...args)保留原始事件参数。
  • 取消节流:可扩展实现取消定时器的逻辑(如 throttle.cancel())。

与防抖(Debounce)的区别

  • 节流:固定间隔内执行一次(均匀分布)。
  • 防抖:停止触发后延迟执行(最后一次有效)。

标签: js
分享给朋友:

相关文章

js实现验证码

js实现验证码

使用Canvas生成图形验证码 在HTML中创建一个Canvas元素用于绘制验证码。通过JavaScript随机生成数字或字母组合,并添加干扰线、噪点等干扰元素增强安全性。 <canvas i…

js实现继承

js实现继承

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

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…

js实现吸色

js实现吸色

使用Canvas实现吸色功能 通过Canvas的getImageData方法获取像素颜色数据。创建一个Canvas元素,将目标图像绘制到Canvas上,通过鼠标事件获取坐标对应的颜色值。 const…