setInterval指定每次执行的间隔,不考虑任务本身消耗的时间,因此会导致每次执行的间隔不固定,可以用下面方式固定间隔时间:var i = 1;
var timer = setTimeout(function f() {
// ...
timer = setTimeout(f, 2000);
}, 2000);
clearTimeout和clearInterval
清除定时器,每次设置定时器,定时器会返回一个整数表示他的编号var id1 = setTimeout(f, 1000);
var id2 = setInterval(f, 1000);
clearTimeout(id1);
clearInterval(id2);
//
function f() {}
setTimeout(f, 1000) // 编号10
setTimeout(f, 1000) // 编号11
setTimeout(f, 1000) // 编号12
防抖debounce
防抖:一段时间内如果没有触发新的事件就执行回调函数,如果触发了新的事件则重新计时。
封装代码function debounce(fn, delay){
var timer = null; // 声明计时器
return function() {
var context = this;
var args = arguments;
clearTimeout(timer);
timer = setTimeout(function () {
fn.apply(context, args);
}, delay);
};
}
节流throttle
节流:一段时间内,只执行第一次触发的事件的回调函数,直到计时结束。function throttle(fn, delay){
let canUse = true
return function(){
if(canUse){
fn.apply(this, arguments)
canUse = false
setTimeout(()=>canUse = true, delay)
}
}
}
const throttled = throttle(()=>console.log('hi'))
throttled()
throttled()