全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

JavaScript 函数节流详解及方法总结

JavaScript 函数节流详解

浏览器一个网页的UI线程只有一个,他同时会处理界面的渲染和页面JavaScript代码的执行(简单扩展一下,浏览器或者JavaScript运行大环境并不是单线程,诸如ajax异步回调、hybrid框架内与native通信、事件队列、CSS运行线程等等都属于多线程环境,不过ES6引入了Promise类来减少了部分异步情况)。因此当JavaScript代码运行计算量很大的方法时,就有可能阻塞UI线程,小则导致用户响应卡顿,严重的情况下浏览器会提示页面无响应是否强制关闭。例如网页的页面滚动事件、移动设备的滑动、缩放事件等。即使没有出现严重的性能问题,我们也应该站在性能优化的角度将短时间内会多次触发的大规模处理时间进行分流计算。

如何有效避免UI线程运行过长的代码,是所有用户交互应用需要考虑的问题,同样的问题在客户端Android可以使用UI主线程开子线程来分散计算。与此对应的,js也可以通过引入webWorker来分散计算,但是在js中有一个更简单并且效果不错的方法:函数节流。使用函数节流的核心技巧就是使用定时器分段计算。具体的实现方式大致有两种思路。

·方法一

1.这种实现方式的思路很好理解:设置一个一间隔时间,比如50毫秒,以此时间为基准设置定时器,当第一次触发事件到第二次触发事件间隔小于50毫秒时,清除这个定时器,并设置一个新的定时器,以此类推,直到有一次事件触发后50毫秒内没有重复触发。代码如下:

function debounce(method){ 
  clearTimeout(method.timer); 
  method.timer=setTimeout(function(){ 
   method(); 
  },50); 
} 

这种设计方式有一个问题:本来应该多次触发的事件,可能最终只会发生一次。具体来说,一个循序渐进的滚动事件,如果用户滚动太快速,或者程序设置的函数节流间隔时间太长,那么最终滚动事件会呈现为一个很突然的跳跃事件,中间过程都被节流截掉了。这个例子举的有点夸张了,不过使用这种方式进行节流最终是会明显感受到程序比不节流的时候“更突兀”,这对于用户体验是很差的。有一种弥补这种缺陷的设计思路。

·方法二

2.第二种实现方式的思路与第一种稍有差别:设置一个间隔时间,比如50毫秒,以此时间为基准稳定分隔事件触发情况,也就是说100毫秒内连续触发多次事件,也只会按照50毫秒一次稳定分隔执行。代码如下:

var oldTime=new Date().getTime(); 
var delay=50; 
function throttle1(method){ 
  var curTime=new Date().getTime(); 
  if(curTime-oldTime>=delay){ 
   oldTime=curTime; 
   method(); 
  } 
} 

相比于第一种方法,第二种方法也许会比第一种方法执行更多次(有时候意味着更多次请求后台,即更多的流量),但是却很好的解决了第一种方法清除中间过程的缺陷。因此在具体场景应根据情况择优决定使用哪种方法。

对于方法二,我们再提供另一种同样功能的写法:

var timer=undefined,delay=50; 
function throttle2(method){ 
  if(timer){ 
    return ; 
  } 
  method(); 
  timer=setTimeout(function(){ 
    timer=undefined; 
  },delay); 
} 

最后说点个外话,说明一下函数节流的名称问题,大家往往会看到throttle和debounce两个方法名,throttle可以译为“节制,卡住”,debounce可以译为“防反跳”。在《JavaScript高级程序设计》中作者介绍了方法一,并且作者使用了“throttle”这个函数名。而在《第三方JavaScript编程》书中同时出现了方法一和方法二,作者将方法一命名为“debounce”,将方法二命名为“throttle”。国内在同时介绍两个方法的时候有些文章错误的将方法一命名为“throttle”,而将方法二命名为“debounce”,从英语的角度来说是很不负责任的。因此在这里拨乱反正:方法一适合理解为“防反跳”,应命名为“debounce”;方法二适合理解为“函数节制”,应命名为“throttle”。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# JavaScript函数节流  # js函数节流的方法  # JavaScript函数节流实例详解  # JavaScript函数节流和函数防抖之间的区别  # JavaScript触发onScroll事件的函数节流详解  # JavaScript性能优化之函数节流(throttle)与函数去抖(debounce)  # JavaScript函数节流概念与用法实例详解  # JS中setTimeout的巧妙用法前端函数节流  # 浅谈JavaScript函数节流  # JavaScript函数节流的两种写法  # 命名为  # 种方法  # 防反  # 很好  # 只会  # 时间为  # 译为  # 在这里  # 拨乱反正  # 站在  # 就有  # 有一种  # 中有  # 而在  # 以此类推  # 时间内  # 可以通过  # 希望能  # 与此  # 掉了 


相关文章: 制作网站外包平台,自动化接单网站有哪些?  电商网站制作公司有哪些,1688网是什么意思?  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  建站之星如何优化SEO以实现高效排名?  高防服务器如何保障网站安全无虞?  营销式网站制作方案,销售哪个网站招聘效果最好?  如何选择高性价比服务器搭建个人网站?  网站微信制作软件,如何制作微信链接?  h5在线制作网站电脑版下载,h5网页制作软件?  MySQL查询结果复制到新表的方法(更新、插入)  金*站制作公司有哪些,金华教育集团官网?  学校建站服务器如何选型才能满足性能需求?  宿州网站制作公司兴策,安徽省低保查询网站?  高端网站建设与定制开发一站式解决方案 中企动力  定制建站方案优化指南:企业官网开发与建站费用解析  建站之星如何实现PC+手机+微信网站五合一建站?  黑客入侵网站服务器的常见手法有哪些?  简历在线制作网站免费,免费下载个人简历的网站是哪些?  小型网站建站如何选择虚拟主机?  如何在建站之星网店版论坛获取技术支持?  如何使用Golang table-driven基准测试_多组数据测量函数效率  广州美橙建站如何快速搭建多端合一网站?  安徽网站建设与外贸建站服务专业定制方案  如何快速生成橙子建站落地页链接?  如何选择网络建站服务器?高效建站必看指南  一键网站制作软件,义乌购一件代发流程?  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  临沂网站制作企业,临沂第三中学官方网站?  如何零成本快速生成个人自助网站?  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  如何在Windows虚拟主机上快速搭建网站?  如何通过.red域名打造高辨识度品牌网站?  如何高效配置香港服务器实现快速建站?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  网站制作公司,橙子建站是合法的吗?  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  如何快速搭建安全的FTP站点?  如何快速选择适合个人网站的云服务器配置?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  婚礼视频制作网站,学习*后期制作的网站有哪些?  如何快速建站并高效导出源代码?  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  Java解压缩zip - 解压缩多个文件或文件夹实例  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  济南专业网站制作公司,济南信息工程学校怎么样?  建站之星安装步骤有哪些常见问题?  公司网站的制作公司,企业网站制作基本流程有哪些?  音乐网站服务器如何优化API响应速度? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。