外部调用一个函数,该函数return一个函数,return的函数不执行,代码如下:
//防抖
function debounce (fn, delay = 1000) {
let time = null
return function () {
// 获取当前this
let that = this
// 判断是否已经存在,如果存在直接清除
if (time) {
clearTimeout(time)
}
time = setTimeout(() => {
// 使fn 中this,执行当前调用者,并传入参数
fn.apply(that, arguments);
}, 100)
})()
}
因为return的是function,外部访问的时候必须加上括号,不然得到的是function本身的内容,但不执行。如果要得到return后的函数,就是要得到debounce()(),而不是debounce(), 所以return的函数必须加上括号。 代码修改如下:
//防抖
function debounce (fn, delay = 1000) {
let time = null
// 因为return的是function,外部访问的时候必须加上括号,不然得到的是function本身的内容,但不执行
return (function () {
// 获取当前this
let that = this
// 判断是否已经存在,如果存在直接清除
if (time) {
clearTimeout(time)
}
time = setTimeout(() => {
// 使fn 中this,执行当前调用者,并传入参数
fn.apply(that, arguments);
}, 100)
})()
}
最后执行成功。
PS: 防抖在连续的事件,只需触发一次回调的场景有: 搜索框搜索输入。只需用户最后一次输入完,再发送请求 手机号、邮箱验证输入检测 窗口大小resize。只需窗口调整完成后,计算窗口大小。防止重复渲染。
节流在间隔一段时间执行一次回调的场景有: 滚动加载,加载更多或滚到底部监听 搜索框,搜索联想功能
2.防抖函数和节流函数的区别 防抖函数是在单位时间(>1)随便触发多少次事件,只要这次触发的时间与上次触发的时间只差不到1s,都不执行;所以执行一次的时候离触发开始可能已经过了2s,3s,4s都有可能了。
节流函数是在单位时间(>1)随便触发多少次事件,只要过了1s,就会执行一次。 两个函数都能达到防止重复触发的功能。但是函数防抖是 n秒后延迟执行;而函数节流是立马执行,n秒后再立马执行。
3.具体的使用主要看需求:
当我们只需要处理最后一次触发事件时,用函数防抖 当事件触发过于频繁,我们需要限制事件处理程序的调用频率时,用函数节流