手写throttle

1.普通版(立即执行)

javascript 复制代码
function throttle(fn, delay) {
    let start = Date.now();
    return function(...args) {
        let end = Date.now();
        if (end - start >= delay) {
            fn.apply(this, args);
            start = end;
        }
    }
}

2.延迟执行

javascript 复制代码
function throttle(fn, delay) {
    let timer = null;
    return function(...args) {
        clearTimeout(timer);
        timer = setTimeout(() => {
            fn.apply(this, args);
        }, delay);
    }
}

3.支持立即执行和尾调用

ini 复制代码
function throttle(fn, delay, options = {}) {
  let timerId = null;
  let lastRunTime = 0;
  const { leading = true, trailing = false } = options; // 默认立即执行,不尾调用

  return function (...args) {
    const now = Date.now();
    const remaining = delay - (now - lastRunTime);

    if (remaining <= 0) {
      // 冷却期已过,可以执行
      if (timerId) {
        clearTimeout(timerId);
        timerId = null;
      }
      if (leading) {
        fn.apply(this, args);
      }
      lastRunTime = now;
    } else if (!timerId && trailing) {
      // 处于冷却期内,且允许尾调用,设置定时器用于尾执行
      timerId = setTimeout(() => {
        fn.apply(this, args);
        lastRunTime = Date.now();
        timerId = null;
      }, remaining);
    }
  };
}
相关推荐
范同学~1 小时前
项目添加水印
java·前端·javascript
软件技术NINI1 小时前
基于PHP和MySQL的快递代收点管理系统的设计与实现
开发语言·javascript·数据库·mysql·毕业设计·php·毕设
Dovis(誓平步青云)1 小时前
一个分区超温就全棚浇水,控制系统怎样按区下策略
开发语言·前端·javascript·人工智能·机器学习
DevNote_2 小时前
1C1G 服务器从零配置实录(附完整命令)
linux·运维·服务器·javascript·adb·ssh·gmssh
Dovis(誓平步青云)2 小时前
切换语言后按钮被截断,本地化审计怎样发现长度风险
开发语言·前端·javascript·人工智能·机器学习·华为·harmonyos
CappuccinoRose2 小时前
拖拽交互体系
前端·javascript·css·html·交互·1024程序员节
开开心心就好2 小时前
免安装PDF盖章工具,透明度和位置可调
运维·服务器·前端·javascript·pdf·ocr·1024程序员节
2501_9445215911 小时前
Ramda 跨端三方库仓颉适配全流程
开发语言·javascript·flutter·php
Ken_111512 小时前
小体积附件下载正常,大附件下载异常
javascript
变与不变80613 小时前
jQuery怎么使用
前端·javascript