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

news2024/11/28 8:29:29

防抖 与 节流

大厂面试题分享 面试题库

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

地址:前端面试题库  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后端面试题库大全

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/533162.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python-ESL】python-esl安装

pip install python-esl 时会报错&#xff1a; “error: command ‘swig’ failed with exit status 1” 报错原因是 因为 swig 软件未正确安装&#xff0c;当然对swig的版本也是有要求的&#xff0c;目前测试以下版本没有问题&#xff1a; swig3.0.63 python-ESL1.4.18(app-…

域名年龄查询工具-域名历史查询工具

批量域名历史查询工具 在近几年的网络营销中&#xff0c;老域名已经成为获取网站排名和SEO优化的重要途径。而对于购买这些老域名&#xff0c;了解域名的过往经历&#xff0c;可以帮助我们更好地评估域名的价值&#xff0c;并避免购买不良的域名。因此&#xff0c;今天我们将向…

微信小程序入门03-搭建权限系统,建库建表

我们准备零基础搭建一个小程序&#xff0c;小程序分为两部分&#xff0c;一个是用户访问的程序&#xff0c;可以是小程序也可以是H5。另外一个就是管理员使用的管理后台&#xff0c;后台第一个要实现的就是搭建权限系统。为了搭建权限系统&#xff0c;我们先需要梳理概念 1 RB…

Oracle自增序列探秘:一篇文章教你读懂

目录 1&#xff1a;什么是Oracle 自增长序列 2 &#xff1a;创建数据-->实现自增长序列 2.1 创建序列 2.2 使用序列 3 &#xff1a;查询数据-->实现自增长序列 1&#xff1a;什么是Oracle 自增长序列 Oracle自增长序列是一种生成唯一数字的方法&#xff0c;可以用于创…

NXP MCUXPresso - .h: No such file or directory

文章目录 NXP MCUXPresso - .h: No such file or directory概述备注END NXP MCUXPresso - .h: No such file or directory 概述 在尝试迁移 openpnp - Smoothieware project 从gcc命令行 MRI调试方式 到NXP MCUXpresso工程. 快摸进门了. 按照C工程编译的. 头文件路径都加好…

Wijmo 2023 Crack添加的一些改进

Wijmo 2023 Crack添加的一些改进 改进了对React 18的支持-增加了对Reack 18严格模式的支持&#xff0c;这有助于开发人员在开发过程中发现常见的错误。 可访问性改进-以下是本版本中添加的一些改进&#xff1a; 改进了FlexGridFilter弹出窗口&#xff0c;用于按条件和值进行筛选…

文本三剑客之——sed编辑器

sed编辑器 sed编辑器sed基础语法sed查询sed删除sed 替换sed 插入 sed编辑器 sed是文本处理工具&#xff0c;依赖于正则表达式&#xff0c;可以读取文本内容&#xff0c;工具指定条件对数据进行添加、删除、替换等操作&#xff0c;被广泛应用于shell脚本&#xff0c;以完成自动…

【交直流保护用HJZ-Y910静态中间继电器 性能稳定功耗小 JOSEF约瑟】

品牌&#xff1a;JOSEF约瑟&#xff0c;型号&#xff1a;HJZ-Y910&#xff0c;名称&#xff1a;静态中间继电器&#xff0c;额定电压&#xff1a;48220VDC&#xff1b;48415VAC&#xff0c;触点容量&#xff1a;250V/5A&#xff0c;功率消耗&#xff1a;≤5W&#xff0c;动作时…

Linux的常见指令(下)

常见指令以及权限理解&#xff08;下&#xff09; 基础指令的继续学习&#xff0c;本篇博客是对于Linux的大部分常见指令的学习和使用&#xff0c;指令的选项都是比较常用的&#xff0c;基本的复制移动&#xff0c;删除文件or目录&#xff0c;查看文件的三种方式cat、more、le…

区块链技术方向的就业前景

区块链技术是一个快速发展的领域&#xff0c;目前正在被越来越多的企业和组织广泛应用。区块链技术在金融、物流、医疗、社交媒体等众多领域都有着广泛的应用。因此&#xff0c;区块链技术方向的就业前景非常乐观。 区块链技术是新一代信息技术的重要组成部分&#xff0c;区块…

SpringBoot 发送邮件(四十三)

从头开始&#xff0c;并不意味着失败&#xff0c;相反&#xff0c;正是拥抱成功的第一步&#xff0c;即使还会继续失败 上一章简单介绍了 SpringBoot 整合 ES (四十二), 如果没有看过,请观看上一章 一. 发送邮件 关于发送邮件的功能和基础知识&#xff0c;老蝴蝶这儿就不重点…

NodeJs在Linux下使用的各种问题

环境:ubuntu16.04 ubuntu中安装NodeJs 通过apt-get命令安装后发现只能使用nodejs&#xff0c;而没有node命令 如果想避免这种情况请看下面连接的这种安装方式&#xff1a; 拓展见:Linux下Nodejs安装&#xff08;完整详细&#xff09; 如果想解决问题的话,输入下面的命令即可…

Sentinel-1的GRD和SLC数据的区别和联系

目录 01 前言 02 Sentinel1下载时的基本参数解释 2.1 卫星平台 2.2 产品类型 03 SLC数据和GRD数据的区别 3.1 处理过程的区别 3.2 处理操作的一点解释 3.2.1 为什么要做地形辐射校正&#xff1f; 3.2.2 多普勒地形校正和地形辐射校正的区别&#xff1f; 01 前言 最近…

【软考数据库】第十二章 事务管理

目录 12.1 事务的基本概念 12.2 数据库的并发控制 12.3 数据库的故障与恢复 12.3.1 事务故障 12.3.2 系统故障 12.3.3 介质故障 12.3.4 数据库备份 12.4 数据库的安全性与完整性 前言&#xff1a; 笔记来自《文老师软考数据库》教材精讲&#xff0c;精讲视频在b站&am…

B2B2C商城系统怎么挑选好?

B2B2C商城它不仅提供B2B模式下的批量交易&#xff0c;还为消费者提供了B2C模式的优质购物体验&#xff0c;因此&#xff0c;越来越多的企业或商家开始重视B2B2C商城系统的搭建&#xff0c;如目前的SHOP、Magento等商城系统。那么&#xff0c;如何挑选合适的B2B2C商城系统呢&…

接口自动化测试—如何实现多套环境的自动化测试?

在敏捷迭代的项目中&#xff0c;通常会将后台服务部署到多套测试环境。那么在进行接口自动化测试时&#xff0c;则需要将服务器的域名进行配置。使用一套接口测试脚本&#xff0c;通过切换域名地址配置&#xff0c;实现多套环境的自动化测试。 实战练习 分别准备两套测试环境…

ffmpeg合并多张图片为视频,加转场

需求是合并多个图片为视频&#xff0c;并在每个图片衔接处加入转场特效&#xff0c;第一种方式是用fade做转场&#xff0c;第二种方式是xfade做转场&#xff0c;xfade的转场特效更多&#xff0c;建议用这个。如果对你有帮助&#xff0c;点赞收藏。 第一种&#xff1a;直接用fa…

实验十 超市订单管理系统综合实验

实验十 超市订单管理系统综合实验 应粉丝要求&#xff0c;本博主帮助实现基本效果&#xff01; 未避免产生版权问题&#xff0c;本项目博主不公开源码&#xff0c;如果您遇到相关问题可私聊博主&#xff01; 一、实验目的及任务 通过该实验&#xff0c;掌握利用SSM框架进行系…

涂鸦智能幻彩灯带开发包,如何帮助开发者寻找创意?

如果你常看短视频&#xff0c;一定被各种炫酷的幻彩灯带产品刷屏过。随着智能幻彩灯带的问世&#xff0c;其玩法也愈加丰富。比如支持用户对灯带上的每一颗灯珠实现亮度和颜色的单独调节&#xff0c;并专属自定义你想要的场景模式&#xff0c;呈现出花式的动态灯光效果。 而且…

【采访】 | “标准化推动车辆诊断的质量和效率”

机动车产业/行业&#xff08;Mobility Industry&#xff09;的变化速度比以往任何时候都快&#xff0c;电动和替代驱动以及数字化和自动驾驶变得愈发重要&#xff0c;需要更为强大且智能的车辆。与此同时&#xff0c;E/E系统的复杂性也在不断增加&#xff0c;这对车载通信提出了…