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

发布时间 - 2026-01-10 22:56:33    点击率:

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函数节流的两种写法  # 命名为  # 种方法  # 防反  # 很好  # 只会  # 时间为  # 译为  # 在这里  # 拨乱反正  # 站在  # 就有  # 有一种  # 中有  # 而在  # 以此类推  # 时间内  # 可以通过  # 希望能  # 与此  # 掉了 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 郑州企业网站制作公司,郑州招聘网站有哪些?  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  高端网站建设与定制开发一站式解决方案 中企动力  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  文字头像制作网站推荐软件,醒图能自动配文字吗?  jquery插件bootstrapValidator表单验证详解  Laravel如何使用Collections进行数据处理?(实用方法示例)  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  如何确认建站备案号应放置的具体位置?  如何快速重置建站主机并恢复默认配置?  使用豆包 AI 辅助进行简单网页 HTML 结构设计  网站图片在线制作软件,怎么在图片上做链接?  详解Android图表 MPAndroidChart折线图  历史网站制作软件,华为如何找回被删除的网站?  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  WEB开发之注册页面验证码倒计时代码的实现  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  北京网站制作公司哪家好一点,北京租房网站有哪些?  免费网站制作appp,免费制作app哪个平台好?  如何用西部建站助手快速创建专业网站?  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  如何将凡科建站内容保存为本地文件?  如何为不同团队 ID 动态生成多个“认领值班”按钮  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  济南网站建设制作公司,室内设计网站一般都有哪些功能?  如何在VPS电脑上快速搭建网站?  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  5种Android数据存储方式汇总  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  详解CentOS6.5 安装 MySQL5.1.71的方法  Android Socket接口实现即时通讯实例代码  如何在腾讯云服务器快速搭建个人网站?  Python并发异常传播_错误处理解析【教程】  千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  如何在服务器上三步完成建站并提升流量?  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  简单实现Android验证码  如何在IIS中新建站点并解决端口绑定冲突?  javascript基于原型链的继承及call和apply函数用法分析