// 暴力版: 定时器期间,有新操作时,清空旧定时器,重设新定时器
// var debounce = (fn, wait) => {
// let timer,context,args;
// let timeStamp = 0;
// //创建定时器函数
// let run = ()=>{
// timer = setTimeout(()=>{
// fn.apply(context,args);
// },wait)
// }
// //清除定时器
// let clear = ()=>{
// clearTimeout(timer);
// }
// return function(){
// context = this;
// args = arguments;
// let now = (new Date()).getTime();
// if(now - timeStamp < wait){
// clear();
// run();
// }else{
// run();
// }
// timeStamp = now;
// }
// }
//防抖:多次触发,执行最后一次。
// var debounce = (fn,wait)=>{
// let timer;
// let context,args;
// return function(){
// context = this;
// args = arguments;
// //清除已有的定时器
// if(timer) clearTimeout(timer);
// timer = setTimeout(()=>{
// fn.apply(context,args)
// },wait)
// }
// }
//节流throttle代码:
function throttle(fn,delay) {
let canRun = true; // 通过闭包保存一个标记
return function () {
// 在函数开头判断标记是否为true,不为true则return
if (!canRun) return;
// 立即设置为false
canRun = false;
// 将外部传入的函数的执行放在setTimeout中
setTimeout(() => {
// 最后在setTimeout执行完毕后再把标记设置为true(关键)表示可以执行下一次循环了。
// 当定时器没有执行的时候标记永远是false,在开头被return掉
fn.apply(this, arguments);
canRun = true;
}, delay);
};
}
function sayHi(e) {
console.log('节流:', e.target.innerWidth, e.target.innerHeight);
}
window.addEventListener('resize', throttle(sayHi,500));
//定时器版节流
function throttle(fn,delay) {
//开始时间设置为0,第一次立即执行
let start = 0;
let context,args;
return function(){
//this指向
context = this;
//传递的参数,类数组形式
args = arguments;
//获取当前时间作为结束时间
let end = Date.now();
//如果结束时间-开始时间大于等于延迟时间,执行一次
if(end - start >= delay){
//将开始时间重置为结束的时间,为下一次执行做准备
start = end;
fn.apply(context,args);
}
}
}
//定时器版节流
function throttle(fn,delay) {
let timer = null;
let context,args;
return function(){
context = this;
args = arguments;
if(!timer){
timer = setTimeout(()=>{
fn.apply(context,args);
//停止计时器:大概是为了防止最后一次执行延迟?
// clearTimeout(timer);
timer = null;
},delay)
}
}
}
console