防抖与节流

概念

函数节流和函数防抖,二者都是优化高频率执行js代码的一种手段。app

函数节流(throttle)与 函数防抖(debounce)都是为了限制函数的执行频次,以优化函数触发频率太高致使的响应速度跟不上触发频率,出现延迟,假死或卡顿的现象。dom

函数节流(throttle)

函数节流是指必定时间内执行的操做只执行一次,也就是说即预先设定一个执行周期,当调用动做的时刻大于等于执行周期则执行该动做,而后进入下一个新周期。
节流:必定时间段内只执行一次函数

function debounce(fn, wait) {   
    var timeout = null;   
    return function() {       
        if(timeout !== null) clearTimeout(timeout);       
        timeout = setTimeout(fn, wait);   
    }
}
// 处理函数
function handle() {   
    console.log(Math.random());
}
// 滚动事件
window.addEventListener('scroll', debounce(handle, 1000));

函数防抖(debounce)

函数防抖是指在必定时间内,在动做被连续频繁触发的状况下,动做只会被执行一次,也就是说当调用动做过n毫秒后,才会执行该动做,若在这n毫秒内又调用此动做则将从新计算执行时间,因此短期内的连续动做永远只会触发一次。
防抖:间隔超过必定时间后才会执行优化

时间戳

var throttle = function(func, delay) {           
    var prev = Date.now();           
    return function() {               
        var context = this;               
        var args = arguments;               
        var now = Date.now();               
        if (now - prev >= delay) {                   
            func.apply(context, args);                   
            prev = Date.now();               
        }           
    }       
}       
function handle() {           
    console.log(Math.random());       
}       
window.addEventListener('scroll', throttle(handle, 1000));

定时器

var throttle = function(func, delay) {
    var timer = null;
    return function() {
        var context = this;
        var args = arguments;
        if (!timer) {
            timer = setTimeout(function() {
                func.apply(context, args);
                timer = null;
            }, delay);
        }
    }
}
function handle() {
    console.log(Math.random());
}
window.addEventListener('scroll', throttle(handle, 1000));
相关文章
相关标签/搜索