函数防抖与节流

前言

在前端开发过程当中常常会绑定一些频繁触发的事件,好比搜索框输入,onmousemove,窗口大小变化等,当过于频繁的触发事件时,无疑会产生一些性能问题。更严重的可能致使程序崩溃。而函数防抖与函数节流则是解决这种问题的解决方案。前端

防抖浏览器

  • 定义

对一个事件进行延迟触发。若是在延迟期间又触发了事件,延迟时间将从新计算。适用于输入框的输入触发。bash

  • 实现
function debounce(fun,time,...arg){
          let timer=null;
          return function(){
            clearTimeout(timer)
            setTimeout(() => {
              fun.call(this,...arg)
            }, time);
          }
        }
        function fun(a,b){
          console.log('触发事件')
          console.log(a)
          console.log(b)
        }
        window.onload=function(){
          document.getElementById('div').addEventListener('click',debounce(fun,1000,1,2))
        }
复制代码

只有当触发事件后一秒内无再次触发操做,函数才会执行。函数

节流性能

  • 定义

在一段时间频繁触发的事件,变为n秒触发一次,下降了触发频次。动画

  • 实现
function throttle(fun,interval,...arg){
          let start=0
          return function(){
            let now=Date.now()
            if(now-start>interval){
              fun.call(this,...arg)
              start=now
            }
          }
        }
        function fun(a,b){
          console.log('触发事件')
          console.log(a)
          console.log(b)
        }
        window.onload=function(){
          document.getElementById('div').addEventListener('click',throttle(fun,1000,1,2))
        }
复制代码

不管多快的触发事件,都会变成一秒触发一次。ui

window.requsetAnimationFrame()this

  • 定义

官方解释:spa

也就是说此方法会用浏览器的最佳渲染频次进行方法调用。适用于动画绘制(从名字上也能看的出来)。 触发时间间隔 1000ms/60,约等于16.6ms每次。code

使用:

window.requestAnimationFrame(()=>{
    console.log('我是一个16.6ms触发一次的节流函数')
}))
复制代码
相关文章
相关标签/搜索