一个纠结了很久的问题,有关于js防抖结合闭包的一个疑惑,求助

十年半夏ぅ 2020-07-17 12:04:46
// 防抖
function calcTop (fn, delay) {
let timer = null;
console.log(timer);
return function () {
if (timer) {
clearTimeout(timer);
}
timer = setTimeout(fn, delay);
}
}

window.onscroll = calcTop(scrollTop, 1000);

为什么timer只执行一次呢?不是只要滚动就触发防抖事假吗?求助。。。
...全文
5583 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
十年半夏ぅ 2020-07-19
  • 打赏
  • 举报
回复
引用 5 楼 foreverpx的回复:
[quote=引用 2 楼 十年半夏ぅ的回复:][quote=引用 1 楼 foreverpx的回复:]滚动触发 calcTop函数,calcTop中利用timer来保存 setTimeout返回的引用。 每次calcTop函数执行的时候,会先检查timer是否存在,如果存在则把之前的imer,也就是定时器清除了(clearTimeout),所以 setTimeout 中的 fn 自然不会执行。
好的,谢谢。那console.log(timer)为什么只打印一次null呢,后面无论怎么滚都不再次打印了[/quote] 因为calcTop函数返回的是一个function,这个function被赋值给了onscroll,滚动的时候执行的是这个function,而不是calcTop。[/quote] 好的,谢谢大佬耐心的解答
foreverpx 2020-07-18
  • 打赏
  • 举报
回复
引用 2 楼 十年半夏ぅ的回复:
[quote=引用 1 楼 foreverpx的回复:]滚动触发 calcTop函数,calcTop中利用timer来保存 setTimeout返回的引用。 每次calcTop函数执行的时候,会先检查timer是否存在,如果存在则把之前的imer,也就是定时器清除了(clearTimeout),所以 setTimeout 中的 fn 自然不会执行。
好的,谢谢。那console.log(timer)为什么只打印一次null呢,后面无论怎么滚都不再次打印了[/quote] 因为calcTop函数返回的是一个function,这个function被赋值给了onscroll,滚动的时候执行的是这个function,而不是calcTop。
十年半夏ぅ 2020-07-18
  • 打赏
  • 举报
回复
引用 1 楼 foreverpx的回复:
滚动触发 calcTop函数,calcTop中利用timer来保存 setTimeout返回的引用。 每次calcTop函数执行的时候,会先检查timer是否存在,如果存在则把之前的imer,也就是定时器清除了(clearTimeout),所以 setTimeout 中的 fn 自然不会执行。
好的,谢谢。那console.log(timer)为什么只打印一次null呢,后面无论怎么滚都不再次打印了
foreverpx 2020-07-17
  • 打赏
  • 举报
回复
滚动触发 calcTop函数,calcTop中利用timer来保存 setTimeout返回的引用。 每次calcTop函数执行的时候,会先检查timer是否存在,如果存在则把之前的imer,也就是定时器清除了(clearTimeout),所以 setTimeout 中的 fn 自然不会执行。

87,904

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧