防抖和节流

92 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

通常在有频繁触发的事件发生时,比如(resize、scroll、mousedown、mousemove、keyup、keydown......),会降低浏览器性能,甚至造成卡顿,我们可以通过防抖(debounce)和节流(throttle)两种方式来解决这个问题。

防抖
  • 原理

    防抖就是防止抖动,当有频繁触发的事件时,在每次触发时等待一定时间(time)之后在执行,如果在time时间内,该事件重新被触发,则重新计算时间。

    eg:在搜索框中,为了提高效率和用户体验,我们一般情况下会在用户输入完成后等待几秒钟出现商品提示选项,而不是输入每一个字母或汉字之后都会请求数据并展示提示商品。

  • 特点

    • 一直触发该事件则不执行
    • 最后一次触发完成后隔一段时间执行
//创建一个变量存放定时器
let timer = null
function debounce() {
    //清除定时器
    clearTimerout(timer)
    //3秒钟后执行代码
    timer = setTimeout(function() {
        //要操作的代码
    },3000)
}
节流
  • 原理

    节流就是节约流量,当有频繁触发的时间时,规定了在一定时间(time)之内,被频繁出发的事件只执行一次,如果在该时间内事件被重复执行,也只在到了规定的time后执行一次。

    eg:监控鼠标滚动到一定高度时展示按钮,不需要在鼠标每次滚动时都判断,可以在一定时间内获取一次当前鼠标滚动高度。

  • 特点

    • 一直触发事件在一定时间内不会多次执行
    • 到了规定的事件或者条件才会执行
//设置变量存放函数执行状态
let flag = true
function throttle() {
    if(!flag) return
    flag = false
    setTimeout(function() {
        //要操作的代码
        flag = true
    },3000)
}
总结

根据不同的需求,选择合适的方法来满足要求并提升性能。