JavaScript节流
节流就是持续触发的事件,每隔一段时间,只执行一次。如鼠标移动触发的事件,如果太频繁,导致性能问题,就需要用到节流。
根据首次是否执行以及尾次是否执行,实现也是不同。使用leading和trailing分别判断首尾是否执行。
节流的实现有两种方式,一:时间戳,二:是定时器。
使用时间戳
当事件触发时,取出当前的时间戳,然后减去之前的时间戳(一开始设置为0),如果大于设置的间隔时间就执行,然后更新时间戳为当前时间戳为下次使用,小于就不执行。
1 | // 第一版,时间戳, 默认是首次执行的 |
使用定时器
1 | // 第二版,定时器, 默认是首次不执行的,尾次执行 |
结合版本
如果首尾都执行,可以结合这个两个版本
1 | function throttle(fn, wait) { |
网上还有一种方法这样写,比较简洁,就是用第二版
1 | function throttle(fn, wait) { |
Underscore版本
1 | // 像underscore 一样的版本 |
注意:
1、underscore
的版本里,如果leading
和traiding
同时设置为false
,再再下次触发时由于没有timer且,上次执行时有previous = now,
所以这时remaining为负的,所以会相当于立即执行,就相
leading:false` 时冲突了,相当于bug吧。
2、return result在trailing !== false
时,最后一次没用,如果 fn
是异步的也没用。