浅聊函数防抖与节流
函数防抖与节流
防抖(debounce)
所谓防抖,就是指触发事件后 n 秒后才执行函数,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。
防抖类型分为
非立即执行版
立即执行版
合成版本 防抖
防抖应用场景
登录、发短信等按钮避免用户点击太快,以致于发送了多次请求
调整浏览器窗口大小时,resize 次数过于频繁,造成计算过多,此时需要一次到位
文本编辑器实时保存,当无任何更改操作一秒后进行保存
非立即执行版
非立即执行版的意思是触发事件后函数不会立即执行,而是在 n 秒后执行,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。
立即执行版本
立即执行版的意思是触发事件后函数会立即执行,然后 n 秒内不触发事件才能继续执行函数的效果。
代码解析
当 执行
debounce
函数时, 第一次进来时,timeout
为 false,所以callNow
的值 为true
,那么它会立即执行func
函数,这时timeout
的值 为true
, 当timeout 值为true 时
, 会执行 清空定时器,此时 timeout 又为 false 了
, 这时callNow
又 为true
,再次执行func
函数。一直循环这样的操作:
当
timeout
为false
时,会立刻执行func
函数。当
timeout
为true
时,它会执行clearTimeOut
,这时timeout
又为false
, 而callNow
=! timeout
, 就会立刻执行func
函数了。
合成版本 防抖
通过传递
Boolean
来决定执行哪种版本。
true
为立即执行版
false
为非立即执行版本
debounce(func,1000,true)
节流
所谓节流,就是指连续触发事件但是在 n 秒中只执行一次函数。 节流会稀释函数的执行频率。
节流有两种实现:
时间戳版本
定时器版本
节流应用场景
scroll
事件,每隔一秒计算一次位置信息等浏览器播放事件,每个一秒计算一次进度信息等
input
输入框在搜索内容时,可以控制多少 s 在执行请求,避免多次发起请求,节约性能。
时间戳版本
定时器版本
代码解析
当执行
throttle
函数时,timeout
默认为undefined
, 此时,! timeout
为true
时,执行 定时器,并且 将timeout
为 null,即为false
, 再次执行throttle
函数时,!timeout
又为true
,再次执行定时器。**通过
timeout
的状态来达到节流的控制 **
总结
防抖: 触发事件后,一定时间后再执行事件,可以
立即执行
也可以一定时间再执行
节流: 控制流量,在单位时间内只能请求一次,避免多次触发事件,影响服务器性能。
参考
版权声明: 本文为 InfoQ 作者【HaiJun】的原创文章。
原文链接:【http://xie.infoq.cn/article/88a0442e948f76e8cc4ed5210】。文章转载请联系作者。
评论