面试官:什么是防抖和节流?如何实现?应用场景?

简介: 面试官:什么是防抖和节流?如何实现?应用场景?

防抖 与 节流

大厂面试题分享 面试题库

前后端面试题库 (面试必备) 推荐:★★★★★

地址:前端面试题库  web前端面试题库 VS java后端面试题库大全

前言

防抖节流作为很多大厂的经典面试题,问倒了许多小伙伴,其实它们的原理和实现都没有那么难,这篇文章带你轻松搞定!

正文

一、定义

防抖:在触发一次函数后规定时间内没有再次触发才执行

节流:连续触发事件,在规定时间内只执行一次

来个经典的比喻,帮助你更好理解:

我们把电梯完成**一次运送**,类比为一次函数的**执行和响应**。 
假设电梯有两种运行策略** debounce **和** throttle **,超时设定为15秒,
不考虑容量限制。 **防抖**:电梯第一个人进来后,
等待15秒。如果过程中又有人进来,15秒等待重新计时,
直到15秒后开始运送。 **节流**:电梯第一个人进来后,15秒后准时运送一次。

二、实现

1. 防抖的实现

实现: 实现前端一个按钮,当你频繁点击时,并不会发送请求,只有当你在规定时间内没有再点击时,才会执行函数。如果停止点击但是在规定时间内再点击,会重新触发计时

思路:在一段连续操作结束后,处理回调,利用clearTimeoutsetTimeout实现。

前端代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <script src="./debounce.js"></script>
  <title>Document</title>
</head>
<body>
 <button id="btn">0<button>   <!-- 按钮实现 -->
  <script src="./debounce.js"></script>   <!-- 引入防抖js文件 -->
  <script>
    let count=0         <!-- 记录点击次数 -->
    let btn=document.getElementById("btn")   <!-- 获取DOM结构 -->
    function add(e){       <!-- 实现按钮点击次数递增 -->
      console.log(this);
      this.innerHTML=count++
      return 123
    }
    btn.addEventListener('click',debounce(add,1000))    <!-- 监听按钮点击事件 -->
  </script>
</body>
</html>

js代码: (这里涉及到了闭包及this的原理)

 function debounce(func,wait){
   let timeout,result
   return function(){
     let args=[...arguments]   //获取事件参数
     clearTimeout(timeout)     //清除上一次的定时器
     timeout= setTimeout(()=>{
       result=func.apply(this,args)   //this显示绑定
     },wait)//定时器会修改this指向 定时器词法环境大多数都是window
     return result
   }

2. 节流的实现

实现: 实现前端一个按钮,在一个规定时间内,只能触发一次函数。如果这个时间内按钮多次点击,只有一次生效。

思路:使用时间戳的写法实现。

前端代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <script src="./throttle.js"></script>
  <title>Document</title>
</head>
<body>
  <button id="btn">0</button>
    <script>
      let count=0
      let btn=document.getElementById("btn")
      function add(){
        console.log(count);
        btn.innerHTML=count++
        return 123
      }
      btn.addEventListener('click',throttle(add,1000))
    </script> 
</body>
</html>

js代码: (这里涉及到了闭包及this的原理)

function throttle(func, wait) {
  let preTime = 0    //上一次的时间
  return function () {
    let args = [...arguments]  //获取事件参数
    let now = +new Date()  //时间戳 精准到秒
    if (now - preTime > wait) {   //点击第二次的时候判断时间有没有到
      func.apply(this, args)
      preTime = now
    }
  }
}

三、应用场景

防抖:

  • 搜索框搜索输入。只需用户最后一次输入完,再发送请求

节流:

  • 滚动加载,加载更多或滚到底部监听

总结

个人理解,防抖就是“一直抖”(频繁触发事件),直到停下来了才执行最后那一次触发;节流就是按照规定时间间隔来,这个规定时间内只执行一次。

 

大厂面试题分享 面试题库

前后端面试题库 (面试必备) 推荐:★★★★★

地址:前端面试题库  web前端面试题库 VS java后端面试题库大全

相关文章
|
7月前
|
机器学习/深度学习 SQL 分布式计算
Spark核心原理与应用场景解析:面试经验与必备知识点解析
本文深入探讨Spark核心原理(RDD、DAG、内存计算、容错机制)和生态系统(Spark SQL、MLlib、Streaming),并分析其在大规模数据处理、机器学习及实时流处理中的应用。通过代码示例展示DataFrame操作,帮助读者准备面试,同时强调结合个人经验、行业趋势和技术发展以展现全面的技术实力。
685 0
|
7月前
|
消息中间件 监控 大数据
Kafka消息队列架构与应用场景探讨:面试经验与必备知识点解析
【4月更文挑战第9天】本文详尽探讨了Kafka的消息队列架构,包括Broker、Producer、Consumer、Topic和Partition等核心概念,以及消息生产和消费流程。此外,还介绍了Kafka在微服务、实时数据处理、数据管道和数据仓库等场景的应用。针对面试,文章解析了Kafka与传统消息队列的区别、实际项目挑战及解决方案,并展望了Kafka的未来发展趋势。附带Java Producer和Consumer的代码示例,帮助读者巩固技术理解,为面试做好准备。
757 0
|
4月前
|
Java
【Java基础面试九】、说一说自动装箱、自动拆箱的应用场景
这篇文章介绍了Java中的自动装箱和自动拆箱概念:自动装箱允许将基本类型赋值给对应的包装类对象,而自动拆箱允许将包装类对象赋值给基本类型,从而简化了两者之间的转换过程。
【Java基础面试九】、说一说自动装箱、自动拆箱的应用场景
|
4月前
|
JavaScript
【Vue面试题十九】、Vue常用的修饰符有哪些有什么应用场景?
这篇文章详细介绍了Vue中的修饰符,包括表单修饰符、事件修饰符、鼠标按键修饰符、键值修饰符和`v-bind`修饰符,解释了它们各自的功能和应用场景,并通过代码示例展示了如何在实际开发中使用这些修饰符来简化事件处理和提高代码的可读性及效率。
【Vue面试题十九】、Vue常用的修饰符有哪些有什么应用场景?
|
4月前
|
存储 前端开发 JavaScript
面试时让你手写一个防抖和节流优化,你能写出来吗?(二)
面试时让你手写一个防抖和节流优化,你能写出来吗?(二)
|
5月前
|
监控 安全 Java
Java面试题:描述Java反射机制及其应用场景,并讨论其优缺点。
Java面试题:描述Java反射机制及其应用场景,并讨论其优缺点。
54 1
|
6月前
|
消息中间件 存储 缓存
面试题--HashMap和TreeMap的区别和应用场景有啥区别?
然后底层调用key的hashCode()方法得出hash值; 过哈希表哈希算法,将hash值转换成数组的下标(注1),下标位置上如果没有任何元素,就把Node添加到这个位置上。如果说下标对应的位置上有值。此时,就会拿着key和链表上每个节点的key进行equal。如果所有的equals方法返回都是false,那么这个新的节点将被添加到链表的末尾。如其中有一个equals返回了true,那么这个节点的value将会被覆盖,如果最终长度大于8就会转成红黑树,红黑树插入;
45 3
|
5月前
|
存储 设计模式 Java
Java面试题:解释代理模式的概念,并举例说明其应用场景。
Java面试题:解释代理模式的概念,并举例说明其应用场景。
83 0
|
5月前
|
设计模式 Java 数据库连接
Java面试题:简述工厂模式的种类及其应用场景,你能举个例子吗?
Java面试题:简述工厂模式的种类及其应用场景,你能举个例子吗?
38 0
|
5月前
|
监控 网络协议 Java
Java面试题:解释Java NIO与BIO的区别,以及NIO的优势和应用场景。如何在高并发应用中实现NIO?
Java面试题:解释Java NIO与BIO的区别,以及NIO的优势和应用场景。如何在高并发应用中实现NIO?
86 0

热门文章

最新文章