JS 防抖封装方法

防抖封装方法:

javascript 复制代码
/**
 * @param {Function} func
 * @param {number} wait
 * @param {boolean} immediate
 * @return {*}
 */
export function debounce(func, wait, immediate) {
  let timeout, args, context, timestamp, result

  const later = function () {
    // 据上一次触发时间间隔
    const last = +new Date() - timestamp

    // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
    if (last < wait && last > 0) {
      timeout = setTimeout(later, wait - last)
    } else {
      timeout = null
      // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
      if (!immediate) {
        result = func.apply(context, args)
        if (!timeout) context = args = null
      }
    }
  }

  return function (...args) {
    context = this
    timestamp = +new Date()
    const callNow = immediate && !timeout
    // 如果延时不存在,重新设定延时
    if (!timeout) timeout = setTimeout(later, wait)
    if (callNow) {
      result = func.apply(context, args)
      context = args = null
    }

    return result
  }
}
相关推荐
阮小贰9 分钟前
干支编码的确定性实现:节气切分 + 1000 条溯源断语(附 JS 源码)
开发语言·javascript·ecmascript
雪芽蓝域zzs15 分钟前
Vue3 + Vite本地模拟数据(读取 JSON 数据)
前端
亿元程序员17 分钟前
还有高手?用Shader让图片中的3D圆环转起来!
前端
灯澜忆梦18 分钟前
【基于GO的Web开发14】gin请求重定向
前端·后端·golang·gin
qq_4523962319 分钟前
第十一篇:《前端性能优化体系:从加载到交互的全链路》
前端·性能优化·交互
一晌小贪欢22 分钟前
Python办公17:暴力拆分——按页数或指定范围提取 PDF 核心页面
java·开发语言·python·pdf·excel·数据可视化·python办公
Mh23 分钟前
听说我兄弟喜欢跑车,所以必须安排上
前端·javascript·vue.js
孫治AllenSun23 分钟前
【LangChain4J-06】Prompt 工程与模板化开发
开发语言·python·prompt
zttbee23 分钟前
vue学习(白话功能版)
前端·vue.js·学习·前端框架
qq_4260039625 分钟前
多语言新增语种全量测试策略
前端·javascript·python·pycharm·自动化