节流: 在规定时间内,多次触发事件,但是只执行一次

场景:输入框搜索,地图渲染

优化用户体验

/**
* 节流 规定时间内不管触发多少次只执行一次
* @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)
}
}

有时候节流和防抖可以交替使用,看业务需求,并不是那么死板

最新文章

  1. js中关于prototype学习(2015年1月5号晚)
  2. jdbc 获取connection 对象的三种方式
  3. JavaScript对象之关联数组
  4. [笔记]Linux命令行大全
  5. HDU 2717(* bfs)
  6. VS Code 常用插件
  7. java与json,一篇就够了
  8. java限制map大小,并FIFO淘汰
  9. day07 深浅拷贝
  10. unity3d热更新插件uLua学习整理
  11. [转]史上最佳 Mac+PhpStorm+XAMPP+Xdebug 集成开发和断点调试环境的配置
  12. YOLO(You Only Look Once)
  13. 合并果子(NOIP2004)
  14. 使用EntityFramework6连接MySQL
  15. 常见手机的useragent
  16. Maven 添加 Tomcat 插件
  17. Android AlarmManager的一些问题
  18. 如何测试Linux 中的wait函数能不能等待子进程的子进程?
  19. 文本(TextView)
  20. Field Security Profile Helper

热门文章

  1. 在url里请求id
  2. python3-xlwt-Excel设置(字体大小、颜色、对齐方式、换行、合并单元格、边框、背景、下划线、斜体、加粗)
  3. Hive学内置条件和字符串函数
  4. 深入理解Magento - 第一章 - Magento强大的配置系统
  5. 一维条码Code 128 类型的 A、B、C及Auto的区别
  6. 【原理】RabbitMQ概要图
  7. 记录一次项目中dubbo-admin实战部署
  8. 理解CommonJS ,AMD ,CMD, 模块规范
  9. CF 。E2. Stars Drawing (Hard Edition) (DP)
  10. 卿烨科技 Fireball