js防抖函数和节流函数使用场景和实现区别示例分析


Posted in Javascript onApril 11, 2020

本文实例讲述了js防抖函数和节流函数使用场景和实现区别。分享给大家供大家参考,具体如下:

开发过程中,都遇到过某个事件被频发触发的场景,比如resize,scroll事件,input事件,而对应的事件处理函数也会被高频率调用,这时会增加浏览器负担,用户体验也不好,这也是防抖函数和节流函数存在的意义和使用场景。

函数防抖(debounce):

持续触发事件时,在设定时间段内没有被触发,才去调用事件处理函数,在设定时间段内如果事件又被触发,则不调用事件处理函数,并从触发事件时间重新开始延时。

具体实现:

设计思路:在setTimeout中调用事件处理函数,如果在定时器触发函数执行之前又触发函数,清除定时器。

function debounce(fn, timeout){
  timeout = timeout || 1000;
  let timer;
  return () => {
    if(timer){ clearTimeout(timer)}
    timer = setTimeout(() => {
      fn()
    },timeout)
  }
}
 
function printEvent(){
  console.log('1121212')
}
 
window.addEventListener('scroll',debounce(printEvent,1000),false)

节流函数(throttle)  throttle   ['θrɑt(ə)l]  油门;节气门;扼杀

当事件被持续触发时,在设定时间内只让事件处理函数触发一次。

定时器实现模式:定时器在延时时间执行过后,重置为null, 定时器为null时,重新设置定时器,如此循环

//节流函数
function throttle(fn, range){
  range = range || 1000;
  let timer;
  return () => {
    //console.log(111,typeof timer)
    if(!timer){
      timer = setTimeout( () => {
        fn()
        timer = null
      },range)
    }
  }
}
 
window.addEventListener('mousemove',throttle(printEvent,1000),false)

时间戳实现模式:初始化时获取时间,每次触发事件时再次获取时间,两次时间间隔等于或大于设定时间,执行事件,初始化时间重置为当前时间,如此循环。

//节流函数 时间戳模式
var throttle2 = function(func, delay) {
var prev = Date.now();

return function() {


var context = this;


var args = arguments;


var now = Date.now();


if (now - prev >= delay) {



func.apply(context, args);



prev = Date.now();


}

}
}

也可以使用时间戳加定时器结合实现:

总结:

函数防抖:在无事件触发后的设定时间执行事件,将几次操作合并为一此操作进行。这样一来,只有最后一次操作能被触发。

函数节流:使得一定时间内只触发一次函数。原理是通过判断是否到达一定时间来触发函数。

区别: 函数节流不管事件触发有多频繁,都会保证在规定时间内一定会执行一次真正的事件处理函数,而函数防抖只是在最后一次事件后才触发一次函数。

比如在页面的无限加载场景下,我们需要用户在滚动页面时,每隔一段时间发一次 Ajax 请求,而不是在用户停下滚动页面操作时才去请求数据。这样的场景,就适合用节流技术来实现。

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

更多关于JavaScript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
使用Json比用string返回数据更友好,也更面向对象一些
Sep 13 Javascript
JS中showModalDialog 的使用解析
Apr 17 Javascript
jquery如何实现在加载完iframe的内容后再进行操作
Sep 10 Javascript
js点击列表文字对应该行显示背景颜色的实现代码
Aug 05 Javascript
JavaScript实现简洁的俄罗斯方块完整实例
Mar 01 Javascript
微信小程序 this和that详解及简单实例
Feb 13 Javascript
angularjs+bootstrap实现自定义分页的实例代码
Jun 19 Javascript
解决Extjs下拉框不显示的问题
Jun 21 Javascript
详解webpack + vue + node 打造单页面(入门篇)
Sep 23 Javascript
VUE 解决mode为history页面为空白的问题
Nov 01 Javascript
vue点击按钮动态创建与删除组件功能
Dec 29 Javascript
详解js中的几种常用设计模式
Jul 16 Javascript
js函数柯里化的方法和作用实例分析
Apr 11 #Javascript
js点击事件的执行过程实例分析【冒泡与捕获】
Apr 11 #Javascript
JavaScript运行机制实例分析
Apr 11 #Javascript
js中调用微信的扫描二维码功能的实现代码
Apr 11 #Javascript
微信公众号中的JSSDK接入及invalid signature等常见错误问题分析(全面解析)
Apr 11 #Javascript
微信分享invalid signature签名错误踩过的坑
Apr 11 #Javascript
vue.js中使用微信扫一扫解决invalid signature问题(完美解决)
Apr 11 #Javascript
You might like
php zip文件解压类代码
2009/12/02 PHP
如何用C语言编写PHP扩展的详解
2013/06/13 PHP
百度实时推送api接口应用示例
2014/10/21 PHP
IE bug table元素的innerHTML
2010/01/11 Javascript
Yii-自定义删除确认弹框(zyd)jquery实现代码
2013/03/04 Javascript
javascript修改IMG标签的src问题
2014/03/28 Javascript
node.js中的console.trace方法使用说明
2014/12/09 Javascript
jquery实现实时改变网页字体大小、字体背景色和颜色的方法
2015/08/05 Javascript
用nodejs搭建websocket服务器
2017/01/23 NodeJs
JS实现电商放大镜效果
2017/08/24 Javascript
JS改变页面颜色源码分享
2018/02/24 Javascript
vue+iview 实现可编辑表格的示例代码
2018/10/31 Javascript
JavaScript代理模式原理与用法实例详解
2020/03/10 Javascript
[42:35]2018DOTA2亚洲邀请赛3月30日 小组赛A组 VG VS OpTic
2018/03/31 DOTA
python中引用与复制用法实例分析
2015/06/04 Python
解决Python3中的中文字符编码的问题
2018/07/18 Python
Python异常的检测和处理方法
2018/10/26 Python
用python实现刷点击率的示例代码
2019/02/21 Python
在SQLite-Python中实现返回、查询中文字段的方法
2019/07/17 Python
nginx搭建基于python的web环境的实现步骤
2020/01/03 Python
python查看矩阵的行列号以及维数方式
2020/05/22 Python
keras 使用Lambda 快速新建层 添加多个参数操作
2020/06/10 Python
使用CSS3来实现滚动视差效果的教程
2015/08/24 HTML / CSS
HTML5 Canvas画线技巧——实现绘制一个像素宽的细线
2013/08/02 HTML / CSS
美国汽车轮胎和轮毂销售网站:Tire Rack
2018/01/11 全球购物
设计师珠宝:Ylang 23
2018/05/11 全球购物
世界上最伟大的马产品:Equiderma
2020/01/07 全球购物
世界上最受欢迎的花店:1-800-Flowers.com
2020/06/01 全球购物
小学关爱留守儿童活动方案
2014/08/25 职场文书
学校党委干部个人对照检查材料思想汇报
2014/10/09 职场文书
职位证明模板
2015/06/23 职场文书
远程教育学习心得体会
2016/01/23 职场文书
如何使用分区处理MySQL的亿级数据优化
2021/06/18 MySQL
CSS实现单选折叠菜单功能
2021/11/01 HTML / CSS
MySQL中varchar和char类型的区别
2021/11/17 MySQL
PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction
2022/04/12 PostgreSQL