手写 防抖 节流

防抖(debounce):一段时间内重复执行的话,只执行最后一次,清除之前的异步任务,重点在清零
应用场景:

  • 搜索框搜索输入。只需用户最后一次输入完,再发送请求
  • 手机号、邮箱验证输入检测
  • 窗口大小resize。只需窗口调整完成后,计算窗口大小。防止重复渲染。
  • 页面滚动处理事件
function debounce(fn,delay){
  let timerId = null
  return function(){
      let context = this
      if(timerId){
         clearTimeout(timerId)
      }
      timerId = setTimeout(()=>{
        fn.apply(context,arguments)
    },delay || 500)
  }
}

function clickHandler() {
  console.log('防抖click')
}

const handler = debounce(clickHandler)
document.getElementById('button').addEventListener('click',handler)

节流(throttle):只在开始执行一次,未执行完成的过程中如果再次触发(类似于游戏cd),则忽略,核心在于开关锁
应用场景:

  • 点击按钮提交表单,第一次有效
function throttle(fn,delay){
  let canUse = true
  return function(){
    if(canUse){
      fn.apply(this,arguments)
      canUse = false
      setTimeout(()=>{canUse = true},delay || 3000)
    }
  }
}

function clickHandler() {
  console.log('节流click')
}

const handler = throttle(clickHandler)
document.getElementById('button').addEventListener('click',handler)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 最近和前端的小伙伴们,在讨论面试题的时候。谈到了函数防抖和函数节流的应用场景和原理。于是,想深入研究一下两者...
    youthcity阅读 23,623评论 5 78
  • 概念 函数防抖(debounce) 函数防抖,就是指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发...
    陶新群阅读 806评论 0 0
  • 另附内容: Lodash 是一个一致性、模块化、高性能的 JavaScript 实用工具库。_.debounce(...
    浅浅_2d5a阅读 3,180评论 0 11
  • 节流与防抖都是通过延迟执行,减少调用次数,来优化频繁调用函数时的性能。不同的是,对于一段时间内的频繁调用,防抖是 ...
    虚拟J阅读 5,647评论 0 1
  • 防抖 防抖(debounce): 如果下达命令后,在t毫秒内再次下达该命令,则取消刚刚下达的命令,只执行新命令 最...
    fanison阅读 260评论 0 0