JavaScript中的节流和防抖
节流: 在规定时间内,多次触发事件,但是只执行一次
场景:输入框搜索,地图渲染
优化用户体验
/**
* 节流 规定时间内不管触发多少次只执行一次
* @param {Function} fn 实际要执行的业务逻辑函数
* @param {Number} duration 在规定时间段内,业务逻辑函数只能执行一次,单位毫秒
*/
function throttle(fn, duration) {
let prev = Date.now(), timerid = null
return function() {
let now = Date.now()
let args = arguments
clearTimeout(timerid) // 一定要提前清除定时器,因为可以 else 分支执行后,设置了一个定时器,如果第二次触发满足 if 条件,则总共会执行两次
if ((now - prev) >= duration) { // 到了预定时间,执行设定函数
fn.apply(this, args)
prev = now
} else { // 没到预定时机,但是事件被触发了,重新起一个定时器
timerid = setTimeout(() => { // 这里保证了最少执行一次,否则达不到 if 条件,函数一次都不会执行
prev = now
fn.apply(this, args)
}, duration)
}
}
}
防抖:多次触发事件,以最后一次触发时机开始,延迟规定时间执行
场景:浏览器滚动时加载图片,点击提交按钮
优化性能
/**
* 防抖 不管事件触发多少次,以最后一次触发时机为准,延迟设定时间执行
* @param {Function} fn 实际要执行的业务逻辑函数
* @param {Number} duration 在规定时间段后,业务逻辑函数开始执行,单位毫秒
*/
function debounce(fn, duration) {
let timerid = null
return function() {
clearTimeout(timerid) // 每次触发都需要清除定时器,并且重新起一个定时器
timerid = setTimeout(() => {
fn.call(this, arguments)
}, duration)
}
}
有时候节流和防抖可以交替使用,看业务需求,并不是那么死板
JavaScript中的节流和防抖的更多相关文章
- JavaScript 中函数节流和函数去抖的讲解
JavaScript 中函数节流和函数去抖的讲解 我们都知道频繁触发执行一段js逻辑代码对性能会有很大的影响,尤其是在做一些效果实现方面,或者逻辑中需要进行后端请求,更是会导致卡顿,效果失效等结果,所 ...
- JavaScript中函数节流的理解
函数节流的原理 函数节流,就是对会频繁触发的函数事件做一些限制,让这些函数可以在每隔一定的时间或者每次满足一定的条件下再触发.一般我们会给他起一个名字throttle.也就是节流的意思.一般这样的函数 ...
- [JavaScript] 节流(throttle)-防抖(debounce) 不懵圈指北
网易云课堂 > 微专业 > 前端高级开发工程师 01.前端高级-JavaScript进阶 > 3.函数式编程 Underscore源码分析 > 3.4.3 throttle 与 ...
- 来聊聊JavaScript中的防抖和节流
目录 JavaScript防抖和节流 问题还原 防抖 什么是防抖 使用场景 节流 什么是节流 使用场景 JavaScript防抖和节流 问题还原 我们先来通过代码把常见的问题还原: <html& ...
- JavaScript 中的防抖和节流
什么是防抖 函数防抖(debounce):当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,又一次触发了事件,就重新开始延时.如下图,持续触发 scrol ...
- JavaScript中函数防抖、节流
码文不易,转载请带上本文链接,感谢~ https://www.cnblogs.com/echoyya/p/14565642.html 目录 码文不易,转载请带上本文链接,感谢~ https://www ...
- javaScript 节流与防抖
首先 我们要知道 节流与防抖可以干什么. 优化网络请求性能——节流 优化页面请求性能——防抖 举两个简单的小例子: 节流: 例如 有些购物页面,会有一些让你抢购的活动,到点的时候,需要你快速的点某个按 ...
- JavaScript节流与防抖函数封装
js节流与防抖函数封装 常见应用场景: window的 resize 和 scroll 事件: 文字输入时的 keyup 事件: 元素拖拽.移动时的 mousemove 事件: 防抖 定义:多次触发事 ...
- JS节流和防抖
事件的触发权很多时候都属于用户,有些情况下会产生问题: 向后台发送数据,用户频繁触发,对服务器造成压力 一些浏览器事件:window.onresize.window.mousemove等,触发的频率非 ...
随机推荐
- 初撩RESTful
1. 什么是RESTful? 一种软件架构风格,设计风格,用于客户端和服务端交互类的架构. 一组架构约束条件和原则 2. 什么是RESTful架构? 客户端通过http动词(get/post等)对服务 ...
- 文件上传绕过WAF
文件上传 文件上传实质上还是客户端的POST请求,消息主体是一些上传信息.前端上传页面需要指定 enctype为multipart/from-data才能正常上传文件. 此处不讲各种中间件解析漏洞只列 ...
- delphi 窗体的位置和高宽度-TForm:Letf、Top、Width、Height、ClientWidth、ClientHeight
delphi 窗体的位置和高宽度-TForm:Letf.Top.Width.Height.ClientWidth.ClientHeight [窗体的高度和宽度]: [客户区的高度和宽度]: [窗体在屏 ...
- 在delphi中执行javascript代码
有时做项目难免用到代码交叉调用,delphi中执行js就是一种,两种方法可用: 一.使用webbrower,比较麻烦 二.使用ScriptControl,简单方便: 1.首先 uses ComObj; ...
- psql内部命令及对应sql语句
\?: 查看所有帮助 \l: 查看所有数据库 SELECT d.datname as "Name", pg_catalog.pg_get_userbyid(d.da ...
- 在Windows Server2016中安装SQL Server2016(转)
在Windows Server2016中安装SQL Server2016(转) 转自: http://blog.csdn.net/yenange/article/details/52980135 参考 ...
- 如何在普通用户权限cmd怎么使用命令行变为管理员权限
这两天在弄MySql,由于我下载的是免安装版本,环境自己配置了一下.有强迫症不喜欢某些服务打开在我不需要的时候,我一般都设置为手动,但是每次使用数据库时都要使用net start mysql启动MyS ...
- 转-C++之虚函数不能定义成内联函数的原因
转自:https://blog.csdn.net/flydreamforever/article/details/61429140 在C++中,inline关键字和virtual关键字分别用来定义c+ ...
- shell cat 合并文件,合并数据库sql文件
> 覆盖写入 >> append模式写入 ###################################################################合并数 ...
- Jeecg中通过Spring_AOP+注解方式实现日志的管理
转载;https://blog.csdn.net/ma451152002/article/details/77234236 Jeecg中通过Spring_AOP+注解方式实现日志的管理 一.设计思路 ...