- 防抖 debunce
如果用手指一直按住一个弹簧,它将不会弹起直到你松手为止。
也就是说当调用动作n毫秒后,才会执行该动作,若在这n毫秒内又调用此动作则将重新计算执行时间。
在一定时间内(例5s内),不管调动多少次方法,也只执行一次方法。
场景:
input 中输入文字自动发送 ajax 请求
var debounce = function(idle, action){
var last
return function(){
var ctx = this, args = arguments
clearTimeout(last)
last = setTimeout(function(){
action.apply(ctx, args)
}, idle)
}
}
- 节流 throttle
如果将水龙头拧紧直到水是以水滴的形式流出,那你会发现每隔一段时间,就会有一滴水流出
也就是会说预先设定一个执行周期,当调用动作的时刻大于等于执行周期则执行该动作,然后进入下一个新周期。
在一定时间内(例30内),不管方法被调动多少次,只会在30s后再调动第二次方法
function throttle(func, wait) {
let lastTime
return function(...rest) {
if (!lastTime ||
(new Date().getTime() - lastTime > wait)) {
lastTime = +new Date()
func.apply(this, rest)
}
}
}