防抖 节流_【前端面试】节流与防抖

我们用两张图表示什么是节流和防抖。

8b1d4c2d9f90deffca647bf88adfc769.png
防抖

495544e51e4778fec2a219f38850446b.png
节流

由图可见,防抖的意思是,当用户在一段时间内连续频繁的试图执行一个函数的时候,只有最后一次,函数被真正的执行。节流的意思是,当用户在某一个时刻执行了一次函数的时候,在一段时间 t 内,再次执行该函数都没有作用

下面,我们用实例,写一个防抖和节流出来。

请先利用下面的命令安装 jquery,在项目根目录下执行。

npm install jquery -save

在 body 里添加

<button id="btn1">btn1</button>

一、防抖

        let id;$("#btn1").on('click',function(e){clearTimeout(id);id = setTimeout(function(){console.log('button clicked',id)},1000);})

这是一个最简单的防抖,但是,缺点是明显的,一个临时变量被放在 window 对象里面了,污染了全局变量空间。因此,我们想把这个变量写成局部的,有经验的同学一定知道,我们该用闭包了,既,使用柯理化函数的编程思想。事实上,上面的这个例子已经是一个闭包了,因为最外层的 id 接住了函数内部 setTimeout 的返回值,因此这个函数的栈内存是不会销毁的。只是,我们的优化方案需要在此基础上再加一层。

本着这个思路,我们有:

        function debounce(){let id;return function(){clearTimeout(id);id = setTimeout(function(){console.log('button clicked',id)},1000);}}var fn = debounce();$("#btn1").on('click',function(e){fn();})

首先,一个全局变量 fn 接住了 debounce 的一个返回值,闭包形成,debounce 内部的 id 被保存住,因此,每次 fn 执行的时候,它所用到的 id 都是一个,这和第一个例子当中全局作用域上面的 id 是等价的,只不过,不会污染全局作用域。

防抖的原理是,如果用户频繁的点击按钮,上一次的 setTimeout 都会立刻被下一次清除,需要执行的函数始终打不出来,只有最后一次没人清除它,因此会被执行。

二、节流

下面我们讲节流,首先,我们还是利用全局作用域写一个简单的版本。

        let time = new Date();$("#btn1").on('click', function (e) {let time1 = new Date();if (time1 - time > 2000) {console.log(time1 - time);time = time1;}})

同样的,这套方法污染了全局作用域,因此,我们需要写个闭包出来,保存局部变量。

        function throttle() {let time = new Date();return function () {let time1 = new Date();if (time1 - time > 2000) {console.log(time1 - time);time = time1;}}}let fn = throttle();$("#btn1").on('click', function (e) {fn();})

节流的原理比防抖更简单,当函数被成功的执行过一次,本次成功执行的时间会被记录下来,那么当用户频繁点击按钮的时候,这些次记录的时间距离上次成功执行的时间太短,小于阈值,因此不被执行。

请各位同学一定要把代码搞到本地跑一遍,这样才能加深印象。

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

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

相关文章

没数据时y轴不显示_Matplotlib数据可视化

1.Matplotlib介绍什么是MatplotlibMatplotlib是一个Python的绘图库&#xff0c;它可与 NumPy 一起使用&#xff0c;可以代替MMatplotlib安装由于Matplotlib是第三方库&#xff0c;所以我们需要安装它才可以使用。注意&#xff0c;Matplotlib3.0要求python3版本才可安装使用。安…

循环划线_经济内外双循环下的思考!

原创&#xff1a;群赢说到这个内外双循环&#xff0c;我们汽车后市场朋友们&#xff0c;应该知道车子发动机水冷系统就是一个双循环&#xff0c;内部小循环&#xff0c;外部大循环。在发动机温度不高的时候&#xff0c;水在做小循环&#xff0c;在发动机周边流动。当发动机温度…

计算机组成原理实验软件仿真系统_计算机系统组成原理(基础)

网上关于计算机系统的讨论众说纷纭。刚开始&#xff0c;我卯足了劲想寻找一个标准答案&#xff0c;后来发现这并不存在&#xff01;因为计算机系统层次不一&#xff0c;看你从什么角度来理解这个问题。在这篇文章里&#xff0c;我的介绍一切从简&#xff0c;不求锦上添花&#…

1110: 最近共同祖先(函数专题)

1110: 最近共同祖先&#xff08;函数专题&#xff09; 时间限制: 1 Sec 内存限制: 128 MB 提交: 3818 解决: 3290 [提交] [状态] [讨论版] [命题人:admin] 题目描述 如上图所示&#xff0c;由正整数1, 2, 3, …组成了一棵无限大的二叉树。从某一个结点到根结 点&#xff08;编…

echart freemarker 模板_SpringBoot集成Freemarker模板生成Echarts图片(三)

紧接着前面两篇&#xff0c;本篇采用Freemarker模板来生成Echarts图片。一. 项目结构二. Freemarker模板(1)柱状图{"title": {"text": "${title}","textStyle": {"color": "red","fontSize": 15,"…

ios 系统提示框_ios13终于能屏蔽系统更新了!附详细教程

很多人会遇到这样的烦恼&#xff0c;ios频繁更新&#xff0c;自己用惯了当前系统版本&#xff0c;系统总提示新的更新请求&#xff0c;不小心点到之后&#xff0c;系统就会自动更新安装&#xff0c;有很多小伙伴更新后&#xff0c;手机变卡顿&#xff0c;耗电量加大&#xff0c…

判断是否有小数_一线老师笔记:数学判断题拿高分的技巧

01什么是判断题&#xff1f;判断是关于对象和它属性有所肯定或者否定的思维形式。在研究数学中&#xff0c;经常要对现实世界的空间形式和数量关系&#xff0c;作出肯定或者否定的回答&#xff0c;因而要大量使用判断&#xff0c;并把一些正确的判断作为进一步研究问题的依据。…

mysql 导入 sqlite_Mysql 数据导入SQlite

SQlite 有一个很强大的管理工具名字叫做Sqlite Developer (官方网站)。在Sqlite Developer中有关于数据导入的强大功能。可以将MSSQL Oracl Aeecss等等数据库导入到Mysql中。但是&#xff0c;默认在Win7环境中没有Mysql的倒入方式。你需要一个叫做“Mysql ODBC”的win客户端工具…

centos 安装mysql 5.7.9_CentOS 6.6下RPM方式安装MySQL 5.7.9

说明&#xff1a;从MySQL5.7.4起&#xff0c;以RPM包的方式安装后的MySQL的部署&#xff0c;默认是安全的&#xff0c;并且有这些特点&#xff1a;1. 在大多数情况下&#xff0c;你只需要安装MySQL-server和MySQL-client安装包就可以安装上一个标准功能的MySQL。对于一个标准安…

mongodb 导入 mysql_将mongodb 数据指定字段导出,然后指定字段导入mysql 实例 及相关问题解决...

需求&#xff1a;将mongodb 数据指定字段导出&#xff0c;然后再指定字段导入mysql 表中直接上图吧&#xff0c;最后 会将遇到几个问题及解决方案贴出&#xff0c;以便遇到类似问题可以迅速解决(期间所用命令具体用法不在本文详解之内)将mongodb 数据指定字段导出&#xff0c;…

mysql外部排序_深入浅出MySQL优先队列(你一定会踩到的order by limit 问题)

0.先抛问题假设字段category无索引且有重复值&#xff0c;order by category 和 limit 组合使用的结果会和预期不符。问题复现&#xff1a;表结构(就是两个字段)CREATE TABLE ratings (id int(11) NOT NULL AUTO_INCREMENT,category int(11) DEFAULT NULL,PRIMARY KEY (id)) EN…

navicat fo mysql 教程_Navicat For MySQL的简单使用教程

1.前提是必须先安装好MySQL数据库(Mac下安装MySQL数据库见前一篇)2.安装Navicat3.点击navicate左上角&#xff1a;连接->MySQL->先测链接下&#xff0c;如果提示连接成功&#xff0c;就可以填写连接名&#xff0c;点击连接即可。双击刚创建的连接下面会有四个数据库用naV…

mysql官网 ab_MySQLAB同步

MySQL 支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日1 . 介绍MySQL 支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并…

mvc json 乱码_你了解JSON吗?——Jackson、FastJson在SpringMVC中的简单使用

原文参考分享自CSDN&#xff1a;你了解JSON吗&#xff1f;--Jackson、FastJson在SpringMVC中的简单使用_欢迎来到 Baret~H 的博客-CSDN博客1. 什么是 JSONJSON&#xff08;JavaScript Object Notation, JS 对象标记&#xff09;是一种轻量级的数据交换格式采用完全独立于编程语…

format 函数包含_Python成为专业人士笔记-高级对象Format格式化

“专业人士笔记”系列目录&#xff1a;创帆云&#xff1a;Python成为专业人士笔记--强烈建议收藏&#xff01;每日持续更新&#xff01;​zhuanlan.zhihu.com在存储和转换数据输出供查看时&#xff0c;字符串格式可能变得非常重要。Python提供了本文概述的各种字符串格式化方法…

python 预测算法_Python 与金融数据使用机器学习算法预测交易策略

记得 关注、分享、点在看呀&#xff5e; 这样您就能持续收到优质的推送啦这一期&#xff0c;我们将使用上一期处理好的数据特征和标签训练机器&#xff0c;然后预测交易策略。我们将分别使用 K近邻算法和集成学习两种方法分别完成模型的训练和预测。FinTech HistoryPython 与金…

mysql 存储过程插入慢_mysql存储过程太慢怎么办

mysql存储过程太慢的解决方法&#xff1a;首先打开my.cnf配置文件&#xff1b;然后添加配置【long_query_time1】&#xff1b;接着通过【tail -f /tmp/logs/mysqld.log】命令监控sql&#xff1b;最后进行针对性的优化即可。解决方法&#xff1a;第一步&#xff1a;修改/etc/my.…

导出远程mysql数据库中的表_shell脚本实现导出远程mysql数据库表数据至本地

bin/main.sh脚本内容 #!/bin/bash#作用&#xff1a;用于同步远程mysql数据库表数据至本地#作者&#xff1a;丁艺博source /etc/profilesource ~/.bash_profileexport LANGen_US.UTF-8export RUN_HOME$(cd "$(dirname "$0")"; echo "${PWD%/*}")s…

商业智能解决方案_格至智能开关:简单便捷的商业智能照明解决方案

美莱恩智能照明推出的格至智能调光开关&#xff0c;是一款便捷、可轻松实现扩展的智能照明系统。它能够节约能源&#xff0c;并在为各种空间工作或者学习的人们&#xff0c;营造最舒适的照明环境。借助美莱恩SLT单火线传输技术&#xff0c;在新建或者改造项目中&#xff0c;你将…

vue 安装 less_解决旧Vue项目升级less-loader 6.0.0报错

作为一个爱折腾的主,我的package随时都是ncu -u! 何为ncu,就是检查nodejs npm/yarn项目依赖最新版本package.json一个插件! 这不,前几天less-loader 升级了最新版,我也迫不及待升级。 升级最新版软件依赖有很多好处,总之作为一个开发者你发布新版本肯定是升级改造的工作…