什么是throttle,直接翻译就是节流的意思,打个比方,比如说中国的三峡大坝,闸门每一分钟打开一次,那么水就是一分钟流一下。在我们的应用中一般用在需要降低频率的地方,比如说:

  • window的onresize,窗口变化时时触发onresize方法,如果我们在onresize做一些dom的操作,显然会大大降低浏览器的性能,所以我们可以降低触发onresize的频率来得以控制。
  • 抢票软件的抢票功能(比如支付宝的抢券),用户连续点击抢票按钮发送http请求到后台,每点击一次按钮发送一次请求,会加剧后台的并发性问题,显然不合理,所以要降低访问的频率。
  • window的onscroll滚动事件

节流是指阻止一个函数在很短时间内的重复调用,必须在超过规定时间间隔后才能重复调用的过程。

  1. 第一次调用,立即执行。
  2. 重复调用,如果超过规定时间,立即执行。
  3. 重复调用,小于规定时间,阻止上一次的调用,重新设置调用定时器。

根据上面的三个步骤,实现代码如下:

function throttle(fn, delay = 1000) {var context;var args;var timer;var prev;var now;function exec() {fn.apply(context, args);prev = now;}return function () {context = this;args = arguments;if (timer) {clearTimeout(timer);timer = null;}if (!prev) {exec();}now = new Date();if (now - prev >= delay) {exec();} else {timer = setTimeout(function () {exec();}, delay);}}
}

例子:

var test = throttle(function () {

console.log("90")

});

test();test();

结果:打印90,延迟1s后打印90;

参考链接:https://github.com/lodash/lodash/blob/master/throttle.js

throttle的实现相关推荐

  1. throttle与debounce的区别

    前几天看到一篇文章,我的公众号里也分享了<一次发现underscore源码bug的经历以及对学术界拿来主义的思考>具体文章详见,微信公众号: 文中讲了大家对throttle和debounc ...

  2. 每日源码分析 - lodash(debounce.js和throttle.js)

    本系列使用 lodash 4.17.4 前言 本文件引用了isObject函数 import isObject from './isObject.js' 判断变量是否是广义的对象(对象.数组.函数), ...

  3. 节流函数(throttle)的原理

    throttle节流函数,就是一个函数调用的频率控制器: var safe = true; function throttle() {if (safe) {lazyLoad();safe = fals ...

  4. 探究防抖(debounce)和节流(throttle)

    本文来自我的博客,欢迎大家去GitHub上star我的博客 本文从防抖和节流出发,分析它们的特性,并拓展一种特殊的节流方式requestAnimationFrame,最后对lodash中的deboun ...

  5. 函数防抖Debounce和函数节流Throttle

    函数节流 & 函数防抖 函数节流和函数防抖 函数节流和函数防抖二者很容易被混淆起来.下面贴英文原文,建议认真阅读: Debouncing enforces that a function no ...

  6. Java版的防抖(debounce)和节流(throttle)

    概念 防抖(debounce) 当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定时间到来之前,又触发了事件,就重新开始延时 节流(throttle) 当持续触发事件时, ...

  7. iOS编程中throttle那些事

    不知道大家对throttle这个单词是否看着眼熟,还是说对这个计算机基础概念有很清晰的了解了.今天就来聊聊和throttle相关的一些技术场景. 定义 我经常有一种感觉,对于英语这门语言的语感,会影响 ...

  8. 事件触发控制_前端性能优化:事件的节流throttle与防抖debounce

    scroll 事件是一个非常容易被反复触发的事件,另外,resize 事件.鼠标事件(比如 mousemove.mouseover 等).键盘事件(keyup.keydown 等)都存在被频繁触发的风 ...

  9. JavaScript函数节流(throttle)与函数去抖(debounce)解析与应用举例

    概念 函数防抖(debounce): 事件响应函数在一段时间后才会执行,如果在这段时间内再次调用,则重新计算执行时间:当预定时间内没有再次调用该函数,则执行响应逻辑. 函数节流(throttle): ...

  10. JavaScript 节流函数 Throttle 详解

    在浏览器 DOM 事件里面,有一些事件会随着用户的操作不间断触发.比如:重新调整浏览器窗口大小(resize),浏览器页面滚动(scroll),鼠标移动 (mousemove).也就是说用户在触发这些 ...

最新文章

  1. java mina 长连接_apache mina 长连接
  2. 谈谈我自己(创业四个多月)
  3. 知识表示与融入技术前沿进展及应用
  4. boost::geometry模块自定义多边形示例
  5. 一键对频对讲机好吗_挑战传统,新型对讲机展现独特一面--极蜂智能网络对讲机...
  6. iconsvg image怎么变为path_昆凌是怎么收服天王周杰伦的?这几招太高明了
  7. 2018 蓝桥杯省赛 B 组模拟赛(五)题 G题
  8. 公交系统如何利用智能调度降低运营费用
  9. JavaScript中的eval函数
  10. Spring @Transactional注解出错:CglibAopProxy - Unable to apply any optimisations to advised method
  11. win7计算机睡眠快捷键,Win7系统在桌面创建睡眠模式快捷键的方法
  12. 计算机设置表格内框线,word表格和边框在哪里 exl表格内框线怎么设置
  13. TX2+TensorRT+DIGITS实现图像的识别、检测和分割---1---Jetson配置
  14. JDBC--基础JDBC
  15. SQL Server 数据库表修改主键字段长度
  16. Java中文拼音转换
  17. CH3-面向对象上 (4个案例实现)
  18. QIL:《Learning to Quantize Deep Networks by Optimizing Quantization Intervals with Task Loss》论文学习
  19. Class.getEnclosingClass 和 Class.getDeclaringClass
  20. 计算机网络 王道论坛2

热门文章

  1. leetcode:20210102周赛第四题——参加会议的最多员工数(基环树+找树枝+dfs最长树枝)
  2. 【git】git拉取远程分支
  3. java httponly设置_cookie 设置 httpOnly属性
  4. 黑马程序员 HTML
  5. 谷歌,IBM ,微软:2019年量子计算驱动区块链加速落地
  6. animator 控制移动_Unity动画机制 Animator与Animator Controller教程
  7. day0816 -- Mybatis
  8. 黑苹果系统安装通用教程(Clover引导)
  9. Python Flask基本使用以及与Pytorch整合
  10. 打造你专属的数据盔甲