当前位置: 首页 > article >正文

【JavaScript手撕代码】防抖节流

防抖节流设计到的知识点很多,有闭包有修改this指向,应当作为重点记忆

防抖节流

防抖

防抖是指,短时间频繁触发fn,只执行最后一次,这样可以有效提高性能,减少服务器压力

也可以这样表述:函数在 n 秒后再执行,如果 n 秒内被触发,重新计时,保证最后一次触发事件 n 秒后才执行。

/*
* @param {Function} callback 回调函数
* @param {Number} delay 回调函数在delay ms 后执行
* @param {Boolean} immediate 是否立即执行回调
**/
function debounce(callback, delay=300, immediate=false){
	let time = null
    // 返回一个闭包
    return (...args) => {
        // 存在定时器则清空, 重新计时
        if(timer){
            clearInterval(timer)
            timer=null
        }
        // 若不立即执行
        if(!immediate){
            timer = setTimeout(() => {
                callback.apply(this, args)
            }, delay)
        }else{
            // 立即执行
            // timer 为空则代表此时不在delay中, 可以立即执行
            let flag = !timer
            flag && callback.apply(this, args)
            timer = setTimeout(() => {
                timer = null
            }, delay)
        }
    }
}

简单版:

function debounce(callback, delay=300){
    let timer = null
    return (...args) => {
        if(timer){
            clearInterval(timer)
            timer = null
        }
        timer = setInterval(() => {
            callback.apply(this, args)
        }, delay)
    }
}

节流

函数在一段时间内只会执行一次,如果多次触发,那么忽略执行

/*
* @param {Function} callback 执行函数
* @param {Number} delay 
*/
function throttle(callback, delay){
    // 上一次执行时的时间
    let start = Date.now()
    return function(){
        // 这一次触发时的时间
        const now = Date.now()
        // 如果相邻两次触发时间超过设置的delay, 说明已经过了限制时间,可以执行函数
        if(now - start >= delay){
            // 更新start, 方便下次对比
            start = now
            // 执行函数
            return callback.apply(this, arguments)
        }
    }
}

http://www.kler.cn/a/153585.html

相关文章:

  • nginx配置反向代理及负载均衡
  • 30秒搞定一个属于你的问答机器人,快速抓取网站内容
  • c语言,输入整数n(行数,本例为4),按照如下规则打印数字图片 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16
  • ubuntu系统下搭建本地物联网mqtt服务器的步骤
  • 01-使用Git操作本地库,如初始化本地库,提交工作区文件到暂存区和本地库,查看版本信息,版本切换命令等
  • 【LeetCode:1094. 拼车 | 差分数组】
  • 模板上新|2023年10月DataEase模板市场上新动态
  • 【数据结构】拆分详解 - 堆
  • 数据结构算法-选择排序算法
  • webpack 使用打包报错 ERROR in node_modules\@types\node\ts4.8\assert.d.ts
  • 图解java.util.concurrent并发包源码系列——深入理解定时任务线程池ScheduledThreadPoolExecutor
  • C语言实现ARM MCU SWD离线调试器
  • Linux Spug自动化运维平台本地部署与公网远程访问
  • redis主从复制模式和哨兵机制
  • C/C++,图算法——求强联通的Tarjan算法之源程序
  • 『吴秋霖赠书活动 | 第五期』《Kubernetes原生微服务开发》
  • Spring Boot + MyBatis-Plus实现数据库读写分离
  • 在IDEA中,如何修改Jetty的端口号,操作超简单
  • elementUI实现根据屏幕大小自适应换行,栅格化布局
  • 自然语言情感分析