JS手写防抖

防抖

什么是防抖

  • 频繁触发只执行最后一次

实现代码:

javascript 复制代码
function debounce(func, wait) {
  let timeout; // 闭包变量,用于存储 setTimeout 返回的ID,保证每次调用共享同一个定时器状态
  
  // 返回一个新的函数,这个函数会在被调用时延迟执行传入的 func
  return function(...args) {  // 使用剩余参数收集所有参数,确保能传递任意数量的参数
    
    // 保存当前函数的执行上下文(this值)
    // 这是为了确保在 func 被调用时,this 指向正确
    const context = this;
    
    // 每次调用时,清除之前的定时器
    // 这样可以确保连续快速调用时,只有最后一次调用会真正执行
    clearTimeout(timeout);
    
    // 设置一个新的定时器,延迟 wait 毫秒后执行
    timeout = setTimeout(() => {
      // 方法1:使用 apply 执行原函数
      // apply 可以接收一个数组作为参数列表,适合这里的情况
      func.apply(context, args);
      
      // 或方法2:使用 call + 展开运算符
      // func.call(context, ...args); // 效果相同,但需要展开 args 数组
    }, wait);
  };
}
相关推荐
yaoxin5211235 分钟前
289. Java Stream API - 从字符串的字符创建 Stream
java·开发语言
癫狂的兔子13 分钟前
【Python】【Flask】抽奖功能
开发语言·python·flask
你怎么知道我是队长14 分钟前
C语言---无名位域
c语言·开发语言
带土129 分钟前
6. C++智能指针(1)
开发语言·c++
海南java第二人37 分钟前
SpringBoot启动流程深度解析:从入口到容器就绪的完整机制
java·开发语言
星火开发设计41 分钟前
C++ queue 全面解析与实战指南
java·开发语言·数据结构·c++·学习·知识·队列
码界奇点44 分钟前
基于Vue3与TypeScript的后台管理系统设计与实现
前端·javascript·typescript·vue·毕业设计·源代码管理
DICOM医学影像1 小时前
2. go语言从零实现以太坊客户端-查询区块链账户余额
开发语言·golang·区块链·以太坊·web3.0·hardhat
ashcn20011 小时前
水滴按钮解析
前端·javascript·css
爱吃奶酪的松鼠丶1 小时前
React长列表,性能优化。关于循环遍历的时候,key是用对象数据中的ID还是用索引
javascript·react.js·性能优化