SOURCE

// 暴力版: 定时器期间,有新操作时,清空旧定时器,重设新定时器
// 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 命令行工具 X clear

                    
>
console