#青训营笔记创作活动 只触发一次 / 只触发最新的事件 / 按照触发顺序执行事件
当我们希望触发一个事件,只触发一次,或者只执行最后一次的时候,就可以利用闭包,创造一个高阶函数(函数返回值为函数)
只触发一次fn
当执行过fn后把fn变成null
funciton once(fn) {
return function(...args) {
if(fn) {
const ret = fn.apply(this, args);
fn = null;
return ret;
}
}
}
只执行最新的事件
function debounce(fn, dur){
//默认延迟时间100
dur = dur || 100;
var timer;
return function(){
clearTimeout(timer);
timer = setTimeout(() => {
fn.apply(this, arguments);
}, dur);
}
}
一个一个time秒后调用fn
function consumer(fn, time){
let tasks = [],
timer;
return function(...args){
tasks.push(fn.bind(this, ...args));
if(timer == null){
timer = setInterval(() => {
tasks.shift().call(this)
//当没有任务时清除定时器
if(tasks.length <= 0){
clearInterval(timer);
timer = null;
}
}, time)
}
}
}