闭包的典型应用--节流与防抖


1.定义

函数防抖(debounce)

函数防抖,就是指触发事件后,在 n 秒后只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数的执行时间。

简单的说,当一个动作连续触发,只执行最后一次。

函数节流(throttle)

限制一个函数在一定时间内只能执行一次

为了方便理解,我们首先通过一个可视化的工具,感受一下三种环境(正常情况、函数防抖情况 debounce、函数节流 throttle)下,对于mousemove事件回调的执行情况。

竖线的疏密代表事件执行的频繁程度。可以看到,正常情况下,竖线非常密集,函数执行很频繁。而 debounce (函数防抖)则很稀疏,只有当鼠标停止移动时,才会执行一次。throttle(函数节流)分布的较为均匀,每过一段时间就会执行一次。

2.简单实现

function debounce(fn, delay = 500) {
    // timer 是在闭包中的
    let timer = null;
    
    return function() {
        if (timer) {
            clearTimeout(timer)
        }
        timer = setTimeout(() => {
            fn.apply(this, arguments)
            timer = null
        }, delay)
    }
}

// test debounce 返回一个函数
input1 = document.getElementById('input1')
input1.addEventListener('keyup', debounce(function () {
    console.log(input1.value)
}, 600))
function throttle(fn, delay) {
    let timer = null
    
    return function() {
        if (timer) {
            return
        }
        timer = setTimeout(() => {
            fn.apply(this, arguments)
            timer = null
        })
    }
}
// test
let div1 = document.getElementById('div1')
div1.addEventListener('drag', throttle(function(e) {
    console.log(e.offsetX, e.offsetY)
}, 100))

3. 应用

函数防抖(debounce)的应用场景

连续的事件,只需触发一次的回调场景有:

  • 搜索框搜索输入。只需要用户最后一次输入完再发送请求
  • 手机号、邮箱格式的输入验证检测
  • 高频点击提交,表单重复提交。

函数节流(throttle)的应用场景

间隔一段时间执行一次回调的场景有:

  • 滚动加载,加载更多或滚动到底部监听
  • 谷歌搜索框,搜索联想功能
  • 窗口大小的 resize 。只需窗口调整完成后,计算窗口的大小,防止重复渲染
  • 省市信息对应字母快速选择

 4. vue 中使用
  

debounce(){
 
    let timer = null;
    return function(){
		if(timer) {
         clearTimeout(timer);
        }else{
         timer = setTimeout(this.func, 200);
        }
    }()  
},
func(){
   console.log("11111")
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
闭包节流都是 JavaScript 中常用的技术,用于解决一些常见的问题。 闭包是指函数能够访问其外部作用域中的变量,即使在函数外部,这些变量也仍然存在。闭包常用于创建私有变量和函数。例如: ``` function counter() { let count = 0; return function() { return ++count; } } const increment = counter(); console.log(increment()); // 1 console.log(increment()); // 2 ``` 节流都是用于处理事件频繁触发的情况,以减少性能开销。 是指在事件触发后一定时间内没有再次触发时,才执行相应的操作。例如: ``` function debounce(fn, delay) { let timer; return function() { const args = arguments; clearTimeout(timer); timer = setTimeout(() => { fn.apply(this, args); }, delay); } } function handleInput() { console.log('Input has stopped.'); } const debouncedHandleInput = debounce(handleInput, 500); document.querySelector('input').addEventListener('input', debouncedHandleInput); ``` 节流是指在一定时间间隔内,只执行一次相应的操作。例如: ``` function throttle(fn, delay) { let lastTime = 0; return function() { const currentTime = Date.now(); if (currentTime - lastTime > delay) { fn.apply(this, arguments); lastTime = currentTime; } } } function handleScroll() { console.log('Scrolling...'); } const throttledHandleScroll = throttle(handleScroll, 500); window.addEventListener('scroll', throttledHandleScroll); ``` 以上是简单的例子,实际应用中还需要根据具体情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值