JS 中防抖&节流

防抖

触发高频事件后 n 秒内只会执行一次,如果 n 秒内再次触发,则重新计算

  • 思路
    • 每次触发事件存一个定时器;
    • 每次触发前,先清空之前的定时器.
    • 实现上次事件未触发,就不去触发,清空.执行之后的事件
function debounce(fn){
    let timeout = null;
    return function(){
        clearTimeout(timeout);
        timeout = setTimeout(()=>{
            fn.apply(this,arguments)
        },500)
    }
}

function sayHi(){
    console.log('Hi~ o(* ̄▽ ̄*)ブ')
}

var inp = document.getElementById('inp');
inp.addEventListener('input', debounce(sayHi));

节流

高频触发事件,在 n 秒内只会执行一次,多次触发不会多次执行

  • 思路
    • 每次触发事件前,判断是否之前的事件已完成,如果完成,就不继续了
function throttle(fn){
    let canRun = true;
    retrun function(){
        if(!canRun) return ; //判断上次事件是否执行完毕
        canRun = false; //执行事件 ,置为 false
        setTimeout(()=>{
            fn.apply(this,arguments);
            canRun = true; // 执行结束够,置为 true,允许下次触发执行
        },500);
    }
}

function sayHi(e){
    console.log(e.target.innerWidth, e.target.innerHeight);
}

window.addEventListener('resize', throttle(sayHi));

你可能感兴趣的:(JS 中防抖&节流)