节流:
- 第一次执行时,是一定能执行函数的。
- n秒内第二次触发的时候,当第一次与第二次间隔不足设置的间隔时间时,就不会执行。之后第三、第四次触发还是不执行。
- 直到 n秒之后有且仅有一次,并且是第一次再次触发函数。 函数节流是减少函数的触发频率;
防抖:
- 第一次触发函数时,定义了一个定时器。在 n秒后执行。
- 函数第二次触发的时候,由于闭包的特性,这时候的 timer已经是第一次触发时的 定时器的标识了。然后直接清除第一次的setTimeout,这时候第一次的setTimeout里面的内容就不会执行了。然后再定义第二次的setTimeout。
- 然后重复第二个步骤,一直清除,又一直设置。直到函数最后一次触发,定义了最后的一个定时器,并且间隔 n秒 执行。
- 如果在 最后一个定时器没执行时,函数又触发了,那么又重复第三步。相当于 设置的间隔时间,只是延迟函数执行的时间,而不是间隔多少秒再执行。
函数防抖是延迟函数执行,并且不管触发多少次都只执行最后一次。
1.方法定义
/*函数节流*/
function throt(fn, interval) {
//触发的时间
let initTime = 0;
return function() {
//第一次函数return(触发时间)
let backTime = new Date();
//第一次触发时间-触发时间>=触发时间
if (backTime - initTime > (interval || 300)) {
fn.call(this,arguments);
//赋值给第一次触发的时间,这样就保存了第二次触发的时间
initTime = backTime;
}
};
}
/*函数防抖*/
function debo(fn, interval) {
var timer;
//间隔时间,如果interval不传,则默认1000ms
return function() {
clearTimeout(timer);
let context=this
// 因为setTimeout是全局的,arguments不是防抖函数需要的。
timer = setTimeout(function() {
fn.call(context,arguments);
}, (interval || 1000));
};
}
export default {
throt,
debo
};
2.页面使用
import utl from "../utils/util.js";
Page({
data:{
top:0
},
onPageScroll: utl.throt(function(msg){
this.setData({
top:msg[0].scrollTop
});
console.log(11111)
},1000),
handle: utl.debo(function() {
this.getData();
}),
getData(){
console.log(2222222222)
}
})