【面试题】debounce vs throttle

简介: debounce 和 throttle 是面试时经常会被问到的一道 JS 题。我自己在第一次找工作的时候,就被问过。当时被问得半天说不出两者的区别,说着说着就把自己带入坑了。今天就跟大家分享一下这两者的区别吧。

image.png


Github 代码:github.com/Haixiang612…预览:yanhaixiang.com/debounce-th…

debounce 和 throttle 是面试时经常会被问到的一道 JS 题。我自己在第一次找工作的时候,就被问过。当时被问得半天说不出两者的区别,说着说着就把自己带入坑了。

今天就跟大家分享一下这两者的区别吧。


debounce 是什么


中文名:防抖。在开始操作了之后,那么只有在一段 delay 时间段后不再有操作了,才执行操作。

const onClick = debounce(fn, 300)
click // 不执行 fn
click // 不执行 fn
等 200 ms 后再 click // 不执行 fn
等 500 ms 后再 click // 执行 fn
复制代码


相信大家上初中物理都见过音叉

image.png

当有东西碰到它的时候,就会一直在震,防抖可以形象地理解为:当不再震动的时候做一些事情。


最常见的场景就是用户不断点击“提交”按钮,debounce 生成的函数就可以在用户一段时间内不再点击时,再执行“提交”操作。


debounce 实现


实现思路如下:


  1. setTimeout 在 delay ms 后执行
  2. 每次调用 debounced 函数时,都直接清除掉 timerId
  3. 当一段时间过去了(大于 delay ms),setTimeout 就会自动执行 fn
function debounce(fn, delay) {
  let timerId, context, args
  function debounced() {
    [context, args] = [this, arguments]
    clearTimeout(timerId) // 以后再次调用的时候会清除掉
    timerId = setTimeout(() => {
      fn.apply(context, arguments)  // 到点执行
    }, delay)
  }
  return debounced
}
复制代码


throttle 是什么


中文名:节流。在开始操作之后,在 delay ms 内只会做一次。

const onMove = throttle(fn, 300)
move // 第一次先执行
move // 300 ms 后执行 fn
过了 3 ms 后 move // 准备在 303 ms 执行 fn
过了 100 ms 后 move // 将上一次的 timerId 去掉,准备 400 ms 执行 fn
过了 301 ms 后 move // 马上执行 fn
复制代码


节流,字面意思就可以理解为 threshold ms 一段时间里做一件事,类似于技能的 CD。当然,这么来理解可能不太准确的,因为 throttle 还有一个条件就是最多执行一次。比如,在 CD 值冷却的时候去执行,虽然现在执行不了,但是会在 delay ms 执行。

只有在无限多次执行上面的 move 才会出现 threshold ms 后再执行一次的技能 CD 效果。


image.png


throttle 实现


实现思路如下:


  1. 第一次调用的时候就执行了
  2. 当上一次时间 + threshold > 当前时间(CD 值在冷却)时调用,会在 thresold ms 后执行
  3. 执行 fn 时会记录当前时间为 preivous
function throttle(fn, threshold) {
  let timerId, previous
  function throttled() {
    let [context, args] = [this, arguments]
    const now = Date.now() // 记录当前时间
    if (previous && now < previous + threshold) {
      clearTimeout(timerId) // 以后调用时,清除时间
      timerId = setTimeout(() => { // 重新计时
        previous = now // 记录时间用于以后的比较
        fn.apply(context, args)
      }, threshold)
    } else {
      previous = now //记录时间用于以后的比较,开始一段新的时间段
      fn.apply(context, args)
    }
  }
  return throttled
}



相关文章
|
存储 缓存 Java
每日一道面试题之LinkedList VS ArrayList~
每日一道面试题之LinkedList VS ArrayList~
|
3月前
|
Java 编译器 开发工具
JDK vs JRE:面试大揭秘,一文让你彻底解锁Java开发和运行的秘密!
【8月更文挑战第24天】JDK(Java Development Kit)与JRE(Java Runtime Environment)是Java环境中两个核心概念。JDK作为开发工具包,不仅包含JRE,还提供编译器等开发工具,支持Java程序的开发与编译;而JRE仅包含运行Java程序所需的组件如JVM和核心类库。一个简单的&quot;Hello, World!&quot;示例展示了两者用途:需借助JDK编译程序,再利用JRE或JDK中的运行环境执行。因此,开发者应基于实际需求选择安装JDK或JRE。
52 0
|
3月前
|
前端开发 应用服务中间件 API
"揭秘!面试官必问:你是如何巧妙绕过跨域难题的?前端代理VS服务器端CORS,哪个才是你的秘密武器?"
【8月更文挑战第21天】在软件开发中,尤其前后端分离架构下,跨域资源共享(CORS)是常见的挑战。主要解决方案有两种:一是服务器端配置CORS策略,通过设置响应头控制跨域访问权限,无需改动前端代码,增强安全性;二是前端代理转发,如使用Nginx或Webpack DevServer在开发环境中转发请求绕过同源策略,简化开发流程但不适用于生产环境。生产环境下应采用服务器端CORS策略以确保安全稳定。
46 0
|
5月前
|
开发框架 Java C++
SpringIOC第二课,@Bean用法,DI详解,常见面试题Autowired VS Resource
SpringIOC第二课,@Bean用法,DI详解,常见面试题Autowired VS Resource
|
6月前
|
存储 算法 关系型数据库
【面试普通人VS高手系列】b树和b+树的理解
【面试普通人VS高手系列】b树和b+树的理解
|
Cloud Native 程序员 Go
硬技能VS软技能:面试中哪个更重要?
硬技能VS软技能:面试中哪个更重要?
137 0
|
前端开发 测试技术
前端面试100道手写题(2)—— throttle与debounce
前端面试100道手写题第二篇《throttle与debounce》,说一下为什么选这两个,其实大家都有在用
100 0
|
JavaScript
【连载】手摸手解析JS手写面试题题系列2——实现throttle(节流)方法
【连载】手摸手解析JS手写面试题题系列2——实现throttle(节流)方法
116 0
面试基础篇——ArrayList VS LinkedList
面试基础篇——ArrayList VS LinkedList
84 0
面试基础篇——ArrayList VS LinkedList
|
编解码 JavaScript 前端开发
【连载】手摸手解析JS手写面试题题系列1——实现debounce(防抖)方法
手摸手解析JS手写面试题题系列1——实现debounce(防抖)方法
105 0