• 主页
  • 归档
  • 分类
  • 照片墙
所有文章 友情链接 关于我

  • 主页
  • 归档
  • 分类
  • 照片墙

函数防抖与函数节流

2019-03-12 15:28:41
总字数 773
预计阅读时间 3 分钟

函数防抖与函数节流都是应用在该函数绑定的事件(比如keyup scroll等)可能在短时间内被频繁调用的情况
应用后可以有效提升性能, 从而优化页面流畅度

防抖(debounce)

在事件被触发n秒后再执行回调函数,如果在这n秒内又被触发,则重新计时

比如事件在9:00被触发, 设定在10秒后执行回调函数
之后在9:03的时候该事件再次被触发, 那么回调函数将会在9:13执行(原本会在9:10执行的回调函数不会执行)
如果在此期间事件再次被触发, 则回调函数执行事件继续向后推移

代码模拟实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
(function(){
function callback(content) {
console.log('这里是需要执行的回调函数' + content)
}
function debounce(fun, delay) {
return function(){
//获取函数的作用域和形参
let that = this
let args = arguments
clearTimeout(fun.id)// 清除定时器
fun.id = setTimeout(function () {
fun.apply(that, args)
}, delay)
}
}
// 这里设定的函数防抖时间为1s
let debounceAjax = debounce(callback, 1000)
document.getElementById('test-input').addEventListener('keyup', function (e) {
debounceAjax(e.target.value)
})
})()

实际的效果就是在输入框当中输入内容, 当输入动作停止1秒后才会执行callback
而不是输入一个字符就执行一次

原理

防抖是创建一个定时器,规定在delay时间后触发函数
但是在delay时间内再次触发的话,都会清除当前的定时器重新计时。这样一来,只有最后一次操作事件才被真正触发。

节流(throttle)

规定一个单位时间,在这个单位时间内,只能有一次触发事件的回调函数执行,如果在同一个单位时间内某事件被触发多次,只有一次能生效。

比如事件在9:00被触发, 设定时间单位是10秒
之后在9:03的时候该事件再次被触发, 那么本次触发就是无效的
在9:00~9:10期间事件再次被触发, 均是无效的

代码模拟实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
(function(){
function callback(content) {
console.log('这里是需要执行的回调函数' + content)
}
function throttle(fn, delay) {
let lastTime
let timer
delay = delay || 300 // 默认间隔为300ms
return function() {
let context = this
let args = arguments
let nowTime = +new Date()// 获取系统当前时间戳
if (lastTime && nowTime < lastTime + delay) { // 当前距离上次执行的时间小于设置的时间间隔
clearTimeout(timer)// 清除定时器
timer = setTimeout(function() { // delay时间后,执行函数
lastTime = nowTime
fn.apply(context, args)
}, delay)
} else { // 当前距离上次执行的时间大于等于设置的时间,直接执行并且记录本次执行的时间戳
lastTime = nowTime
fn.apply(context, args)
}
};
}
let throttleAjax = throttle(callback, 1000)
document.getElementById('test-input2').addEventListener('keyup', function (e) {
throttleAjax(e.target.value)
})
})()

应用场景举例

节流: 提交按钮的防重点
防抖: input框对输入内容的自动联想

  • JavaScript
  • 函数
  • JavaScript

扫一扫,分享到微信

vim学习手记(1)
js对文件和二进制的操作 
© 2024 夏夜梦星辰
鲁ICP备19028444号
Power By Hexo
正在搜索...
  • 所有文章
  • 友情链接
  • 关于我
标签: 分类:
  • maven
  • 持续集成
  • JMS
  • 线程
  • JavaScript
  • ECMAScript6
  • 单元测试
  • Promise
  • Web Worker
  • 函数
  • prototype
  • 模块化
  • 正则表达式
  • 数据库
  • MongoDB
  • 索引
  • 集群
  • 全文检索
  • flutter
  • dart
  • git
  • 版本控制
  • linux
  • shell
  • docker
  • nginx
  • jenkins
  • opencv
  • vim
  • react
  • react native
  • 前端
  • css
  • HTML5
  • Hexo
  • sass
  • Three.js
  • TypeScript
  • Vue
  • 组件化
  • base64
  • webpack
  • nodejs
  • gulp
  • TensorFlow
  • 机器学习
  • 算法
  • 动态规划
  • 数据结构
  • Java
  • JavaScript
  • MongoDB
  • flutter
  • Git
  • linux
  • react
  • 前端杂烩
  • 男生女生
  • 算法
  • 函数式进阶-管道

    2023-01-19

    JavaScript

    JavaScript函数

  • CSS计数器

    2022-12-30

    前端杂烩

    前端css

  • Three.js初见(2)

    2022-04-10

    前端杂烩

    前端Three.js

  • Three.js初见(1)

    2022-04-03

    前端杂烩

    前端Three.js

  • Vue3新特性总结

    2022-03-13

    前端杂烩

    前端Vue

  • TypeScript实用工具类型

    2021-05-11

    前端杂烩

    TypeScript

  • TensorFlow.js初见(2)

    2021-04-27

    算法

    TensorFlow机器学习

  • parcel+react+tsx

    2021-04-06

    react

    react

  • TensorFlow.js初见(1)

    2021-04-01

    算法

    TensorFlow机器学习

  • Web Components

    2020-11-03

    前端杂烩

    组件化

  • 图片加载失败处理

    2020-10-28

    前端杂烩

    前端css

  • 原生CSS变量

    2020-10-23

    前端杂烩

    前端css

  • CSS属性shape-outside

    2020-07-04

    前端杂烩

    前端css

  • Vue项目改造Typescript

    2020-04-21

    前端杂烩

    前端TypeScript

  • linux守护进程

    2020-01-12

    linux

    linux

  • 重新认识JSON.stringify

    2019-12-11

    JavaScript

    JavaScript

  • Flutter踩坑记录

    2019-11-30

    flutter

    flutterdart

  • Flutter路由

    2019-11-10

    flutter

    flutterdart

  • Flutter动态列表

    2019-11-06

    flutter

    flutterdart

  • Flutter初见

    2019-10-21

    flutter

    flutterdart

  • dart初见(2)

    2019-10-06

    flutter

    dart

  • dart初见(1)

    2019-09-28

    flutter

    dart

  • Web-Workers

    2019-09-21

    JavaScript

    JavaScriptWeb Worker

  • xargs命令

    2019-08-23

    linux

    linux

  • 洗牌算法

    2019-07-22

    算法

    算法

  • Jest单元测试

    2019-07-21

    JavaScript

    JavaScript单元测试

  • 数据库索引原理浅析

    2019-07-16

    算法

    索引数据结构

  • TypeScript泛型

    2019-07-13

    前端杂烩

    TypeScript

  • 博客全文检索施工记录

    2019-07-09

    MongoDB

    MongoDB全文检索

  • 优雅写异步与循环

    2019-06-29

    JavaScript

    JavaScript

  • TypeScript初见

    2019-06-23

    前端杂烩

    TypeScript

  • 照片墙施工记录

    2019-05-12

    前端杂烩

    前端Hexo

  • 博客部署调整记录

    2019-05-11

    前端杂烩

    nodejsgulp

  • webpack4升级踩坑

    2019-04-30

    前端杂烩

    前端webpack

  • 博客图片迁移-后续

    2019-04-23

    前端杂烩

    nodejs

  • 1.2、linux常用命令与技巧(2)

    2019-04-21

    linux

    linux

  • 博客图片迁移记

    2019-04-18

    前端杂烩

    jenkinsnodejs

  • gitlab调用jenkins实现自动构建

    2019-03-31

    linux

    linuxjenkins

  • vim学习手记(2)

    2019-03-30

    linux

    linuxvim

  • vim学习手记(1)

    2019-03-27

    linux

    linuxvim

  • 函数防抖与函数节流

    2019-03-12

    JavaScript

    JavaScript函数

  • js对文件和二进制的操作

    2019-01-30

    JavaScript

    JavaScript

  • gcc与nodejs的编译安装

    2019-01-19

    linux

    linux

  • 正则表达式重新入门(2)

    2018-12-24

    JavaScript

    正则表达式

  • 正则表达式重新入门(1)

    2018-12-10

    JavaScript

    正则表达式

  • Promise(3)-async与await

    2018-12-06

    JavaScript

    JavaScriptPromise

  • 持续集成-jenkins

    2018-11-07

    Java

    持续集成

  • 消息中间件(2)-java连接ActiveMQ

    2018-11-02

    Java

    JMS

  • 消息中间件(1)-初见

    2018-10-24

    Java

    JMS

  • bash通配符

    2018-09-26

    linux

    linuxshell

  • 动态规划(2)

    2018-09-01

    算法

    算法动态规划

  • 动态规划(1)

    2018-08-27

    算法

    算法动态规划

  • react-native(1)-初见

    2018-08-13

    react

    react native

  • 3.5、Docker(5)-容器连接

    2018-07-09

    linux

    linuxdocker

  • Hexo服务器静态化部署

    2018-07-02

    前端杂烩

    Hexo

  • 3.4、Docker(4)-nginx

    2018-06-27

    linux

    dockernginx

  • table-cell应用

    2018-06-15

    前端杂烩

    前端css

  • Optional

    2018-06-14

    Java

  • 重新认识display

    2018-06-14

    前端杂烩

    前端css

  • webpack(3)-补充

    2018-06-10

    前端杂烩

    webpack

  • webpack(2)-进阶

    2018-06-10

    前端杂烩

    webpack

  • webpack(1)-初见

    2018-06-10

    前端杂烩

    webpack

  • base64文件上传

    2018-05-30

    前端杂烩

    base64

  • 二进制有关问题两则

    2018-05-26

    算法

    算法

  • 模块化编程(2)

    2018-05-06

    JavaScript

    JavaScript模块化

  • 模块化编程(1)

    2018-05-06

    JavaScript

    JavaScript模块化

  • Symbol

    2018-05-06

    JavaScript

    JavaScriptECMAScript6

  • new关键字做了什么

    2018-05-02

    JavaScript

    JavaScript

  • 生成器函数

    2018-04-29

    JavaScript

    JavaScriptECMAScript6

  • 扩展运算符的用法

    2018-04-28

    JavaScript

    JavaScriptECMAScript6

  • ES6的重要新特性

    2018-04-22

    JavaScript

    JavaScriptECMAScript6

  • Promise(2)

    2018-04-20

    JavaScript

    JavaScriptPromise

  • Promise(1)

    2018-04-20

    JavaScript

    JavaScriptPromise

  • 2.3、shell(4)-使用技巧

    2018-03-06

    linux

    linuxshell

  • 2.2、shell编程(3)-流程控制与函数

    2018-03-06

    linux

    linuxshell

  • 2.0、shell编程(1)-初见

    2018-03-05

    linux

    linuxshell

  • 2.1、shell编程(2)-从入门到重新入门

    2018-03-05

    linux

    linuxshell

  • 7.0、使用浏览器访问MongoDB

    2018-02-16

    MongoDB

    数据库MongoDB

  • 6.1、快速搭建复制集

    2018-02-11

    MongoDB

    数据库MongoDB集群

  • 6.0、复制集

    2018-02-11

    MongoDB

    数据库MongoDB集群

  • 3.3、Docker(3)-部署wordpress实践

    2018-02-10

    linux

    linuxdocker

  • 3.2、Docker(2)-使用技巧

    2018-02-09

    linux

    linuxdocker

  • 3.1、Docker(1)-初见

    2018-02-08

    linux

    linuxdocker

  • 5.2、关联映射

    2018-01-27

    MongoDB

    数据库MongoDB

  • 5.1、morphia

    2018-01-26

    MongoDB

    数据库MongoDB

  • 5.0、Java操作MongoDB数据库

    2018-01-26

    MongoDB

    数据库MongoDB

  • crontab-定时任务

    2018-01-14

    linux

    linux

  • expect-交互式命令行自动化执行

    2018-01-14

    linux

    linux

  • opencv编译安装

    2018-01-10

    linux

    linuxopencv

  • Lamdba表达式(2)-Stream

    2018-01-09

    Java

  • Lamdba表达式(1)

    2018-01-09

    Java

  • 4.0、安全验证

    2018-01-09

    MongoDB

    数据库MongoDB

  • Hexo站点实现站内搜索

    2018-01-09

    前端杂烩

    Hexo

  • Hexo搭建个人博客

    2018-01-09

    前端杂烩

    Hexo

  • 3.3、索引构建情况分析

    2018-01-04

    MongoDB

    数据库MongoDB索引

  • 3.2.1、GeoJSON

    2018-01-04

    MongoDB

    数据库MongoDB索引

  • 1.1、linux常用命令与技巧(1)

    2018-01-03

    linux

    linux

  • Maven(6)-可运行jar打包

    2017-12-27

    Java

    maven

  • 面向对象编程

    2017-12-20

    JavaScript

    JavaScript

  • 3.2、地理位置索引

    2017-12-19

    MongoDB

    数据库MongoDB索引

  • 3.1、全文索引

    2017-12-16

    MongoDB

    数据库MongoDB索引

  • 3.0、索引

    2017-12-16

    MongoDB

    数据库MongoDB

  • 2.1、数据查询

    2017-12-15

    MongoDB

    数据库MongoDB

  • 2.0、数据库基本操作

    2017-12-15

    MongoDB

    数据库MongoDB

  • 1.1、MongoDB的安装与配置

    2017-12-12

    MongoDB

    数据库MongoDB

  • 1.0、NoSQL

    2017-12-12

    MongoDB

    数据库MongoDB

  • Git(4)-远程仓库

    2017-11-19

    Git

    git版本控制

  • Git(3)-分支

    2017-11-18

    Git

    git版本控制

  • Git(2)-基础操作

    2017-11-18

    Git

    git版本控制

  • Git(1)-初见

    2017-11-18

    Git

    git版本控制

  • SASS-语法(2)

    2017-11-13

    前端杂烩

    前端sass

  • SASS-语法(1)

    2017-11-12

    前端杂烩

    前端sass

  • SASS-初见

    2017-11-11

    前端杂烩

    前端sass

  • HTML5的缓存策略

    2017-11-10

    前端杂烩

    HTML5

  • 实现call方法

    2017-11-10

    JavaScript

    JavaScriptprototype

  • Maven(5)-jetty-plugin

    2017-10-19

    Java

    maven

  • CSS中的字体

    2017-10-19

    前端杂烩

    前端css

  • Maven(4)-补充

    2017-10-18

    Java

    maven

  • Maven(3)-从入门到重新入门

    2017-10-18

    Java

    maven

  • 实现bind方法

    2017-10-14

    JavaScript

    JavaScriptprototype

  • 变量的定义提升

    2017-10-14

    JavaScript

    JavaScript函数

  • 函数形参与arguments

    2017-10-14

    JavaScript

    JavaScript函数

  • CSS动画(3)-animation

    2017-10-12

    前端杂烩

    前端css

  • CSS动画(2)-transition

    2017-10-12

    前端杂烩

    前端css

  • CSS动画(1)-transform

    2017-10-12

    前端杂烩

    前端css

  • Maven(2)-搭建web项目

    2017-10-11

    Java

    maven

  • 自增的线程安全问题

    2017-10-09

    Java

    线程

  • Maven(1)-初见

    2017-10-09

    Java

    maven

  • CSS布局(4)-grid

    2017-09-17

    前端杂烩

    前端css

  • CSS布局(3)-Flex实践

    2017-09-15

    前端杂烩

    前端css

  • CSS布局(2)-Flex

    2017-09-15

    前端杂烩

    前端css

  • CSS布局(1)

    2017-09-14

    前端杂烩

    前端css

  • HashMap的工作原理

    2017-09-14

    Java

  • viewport

    2017-09-09

    前端杂烩

    前端

  • 响应式布局

    2017-09-06

    前端杂烩

    前端css

  • 僵尸镇·蚀心引

    2016-05-19

    男生女生

  • 鬼脸

    2016-05-16

    男生女生

  • 迷失

    2016-05-16

    男生女生

  • 死于重阳

    2016-05-16

    男生女生

  • 悲伤纸人

    2016-05-16

    男生女生

  • 我到底杀了谁

    2016-05-16

    男生女生

  • 惊蛰

    2016-05-16

    男生女生

  • 鸟人

    2016-05-16

    男生女生

  • 第五个人

    2016-05-16

    男生女生

  • 宠爱

    2016-05-16

    男生女生

  • 杀人钟

    2016-05-16

    男生女生

  • 废人

    2016-05-16

    男生女生

  • 笑道

    2016-05-16

    男生女生

  • 抽象画

    2016-05-16

    男生女生

  • Bug

    2016-05-16

    男生女生

  • “善终善始”服务

    2016-05-16

    男生女生

  • 第二次约会

    2016-05-16

    男生女生

  • 伤疤

    2016-05-16

    男生女生

  • 别信小孩

    2016-05-16

    男生女生

  • 圣菊

    2016-05-16

    男生女生

  • 黄全网吧

    2016-05-16

    男生女生

  • 邮差

    2016-04-11

    男生女生

  • 遗落在兰若寺的心

    2016-04-11

    男生女生

  • 橡皮擦

    2016-04-11

    男生女生

  • 我们是一家人

    2016-04-11

    男生女生

  • 寿宴记

    2016-04-11

    男生女生

  • 石中鱼

    2016-04-11

    男生女生

  • 劝说者

    2016-04-11

    男生女生

  • 少年残像

    2016-04-09

    男生女生

  • 笙歌

    2016-04-09

    男生女生

  • 童魂

    2016-04-09

    男生女生

  • 酷刑

    2016-04-09

    男生女生

  • 巴别塔以北

    2016-04-09

    男生女生

  • 我要见皇上

    2016-04-09

    男生女生

  • 大江湖

    2016-04-09

    男生女生

  • 铅笔情诗

    2016-04-09

    男生女生

  • 唇亡齿寒

    2016-04-09

    男生女生

  • 推销员守则

    2016-04-09

    男生女生

  • 陌生人在妄城

    2016-04-09

    男生女生

  • 天佑爱人

    2016-04-09

    男生女生

  • 西风曾相识

    2016-04-09

    男生女生

  • 纺院惊梦

    2016-04-09

    男生女生

  • 偶数

    2016-04-09

    男生女生

  • 木记

    2016-04-09

    男生女生

  • 罗刹海市

    2016-04-09

    男生女生

  • 灵感

    2016-04-09

    男生女生

  • 老梁

    2016-04-09

    男生女生

  • 画皮

    2016-04-09

    男生女生

  • 地行客

    2016-04-09

    男生女生

  • 1982

    2016-04-09

    男生女生

  • X先生

    2016-04-09

    男生女生

  • 锦怒

    2016-04-09

    男生女生

  • 双面感应

    2016-04-09

    男生女生

  • 尖叫的老巫婆

    2016-04-09

    男生女生

  • 匿名的宝贝

    2016-04-09

    男生女生

  • 极光之逝

    2016-04-09

    男生女生

  • 天蝎森林

    2016-04-09

    男生女生

  • 巫毒娃娃

    2016-04-09

    男生女生

  • 洛城故事

    2016-03-21

    男生女生

  • 十年饮冰,难凉热血
  • †少女癌†
  • 猫与向日葵
  • coderfun
  • JENKINS
  • API管理后台
愿你最终能接纳每一面每一种的自己
独自活着便是团圆
  1. 1. 防抖(debounce)
    1. 1.1. 代码模拟实现
    2. 1.2. 原理
  2. 2. 节流(throttle)
    1. 2.1. 代码模拟实现
  3. 3. 应用场景举例