防抖,节流 | 青训营笔记

112 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的的第2天

防抖与节流

昨天跟着月影老师的对JavaScript的学习讲解过程中,发现了防抖与节流、JavaScript自定义事件自己不是很清楚,在这里对防抖与节流进行记录

概念解读区分

防抖 : 每一次触发事件,都重新计时,直到事件执行结束

节流 : 只要在一个事件的执行期间内,其他的每次触发事件都不会生效

简单来说就是,防抖是事件停止触发且过了指定时间后执行一次,节流是间隔指定的时间执行一次。

使用场景

防抖

用户多次短时间多次点击,导致客户端向服务端发送大量请求,造成服务端压力。

用户输入内容时,不断向服务端发送请求。

防抖常用于防止用户频繁向服务器发送请求,或者避免浏览器的画面过于频繁地重绘。

节流

页面滚动事件

鼠标连续触发事件

同一件事多次执行

目的

防抖 :减少请求次数,降低服务端压力,增加性能

节流 : 控制一段时间内,事件发送频率

总的来说,都是为了降低压力,进行性能的优化。

使用

防抖

function debounce(fn,argument) { 
    // 创建一个变量用来存放定时器的返回值(使用闭包知识点) 
    let timer = null;
    //返回一个函数
    return function() { 
        // 每次当用户触发事件的时候,把前一个定时器清除 
        clearTimeout(timer); 
        // 然后创建一个新的定时器,保证用户事件只触发一次
        timer = setTimeout(() => { 
        //此时this指向触发函数的事件,因此绑定的argument就是事件的参数列表,也就是该函数原本的参数列表
            fn.apply(this, arguments)
        }, 1000); 
    } 
}

节流

function throttle(fn, delay) { 
    // 初始化一个时间 
    let begin = 0; 
    return function() { 
        // 获取当前时间戳 
        let cur = new Date().getTime(); 
        // 只有两次触发的时间间隔大于指定值,才会触发事件函数 
        if (cur - begin > delay) { 
        fn.apply(this, arguments); 
            begin = cur; 
        } 
    } 
}