JavaScript函数节流的两种写法


Posted in Javascript onApril 07, 2017

最近看了函数节流的相关内容,具体什么是节流我不讨论了,网上很多,这里总结下两个方法,我只认可其中一个。另一个貌似也能达到节流的效果但是感觉不是很正规。

方法一:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>函数节流</title>
 <style>
 div{
  font-size:40px;
  color:red;
  text-align: center;
 }
 </style>
</head>
<body>
<div>0</div>
 <script>
var a=0;
 var oDiv=document.getElementsByTagName('div')[0];
 var throttle=function(fn,wait){
 var startTime=new Date();
 return function(){
  var arg=arguments;
  var context=this;
  var curTime=new Date();
  // 如果达到了规定的触发时间间隔,触发 handler
  var remaing=wait-(curTime-startTime)
  if(remaing<=0||remaing>wait){//按理说remaing足够证明已经到了时间间隔,但是为了防止客户端修改了时间所以加个条件(为什么这么加我也不懂)
  fn.apply(context,arg);
  startTime=curTime;
  }
 };
 };
 window.onmousemove=throttle(function(){
  a++;
  oDiv.innerText=a+"";
 },2000);
 </script>
</body>
</html>

我比较认可这个方法,另外这是简洁版,还有一种可以是这样子的

function throttle(fun, delay, time) {
  var timeout,
    startTime = new Date();
  return function() {
    var context = this,
      args = arguments,
      curTime = new Date();
    clearTimeout(timeout);
    // 如果达到了规定的触发时间间隔,触发 handler
    if (curTime - startTime >= time) {
      fun.apply(context, args);
      startTime = curTime;
      // 没达到触发间隔,重新设定定时器
    } else {
      timeout = setTimeout(function(){
       fun.apply(context, args);
      }, delay);
    }
  };
};

就是在判断完时间间隔后再加个计时器来延迟,这个我觉得加不加都行,加了也没错跟时间判断互补,不加也能实现节流的效果。

第二类写法:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>函数节流</title>
 <style>
 div{
  font-size:40px;
  color:red;
  text-align: center;
 }
 </style>
</head>
<body>
<div>0</div>
 <script>
 var a=0;
 var oDiv=document.getElementsByTagName('div')[0];
 var throttle=function(fn,time){
  var timer=null;
  return function(){
  var arg=arguments;
  var context=this;
  if(timer){
   return false;
  }
  else{
  timer=setTimeout(function(){
   clearTimeout(timer);
   timer=null;
   fn.apply(context,arg);
  },time);
  }
 };
 };
 window.onmousemove=throttle(function(){
   a++;
 oDiv.innerText=a+"";
  },2000);
 </script>
</body>
</html>

这种写法通过判断是否存在正在进行的计时器来决定是否执行函数,存在就结束运行函数,但是那个计时器仍在队列里进行实践一到还会执行,通过运行也能达到节流,也就是间隔固定的时间触发函数,但是我就是不太喜欢这种写法。可能是这种方法没第一种直接吧。 

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
JavaScript通过select动态更换图片的方法
Mar 23 Javascript
javascript实现信息增删改查的方法
Jul 25 Javascript
JS实现3D图片旋转展示效果代码
Sep 22 Javascript
jQuery Form 表单提交插件之formSerialize,fieldSerialize,fieldValue,resetForm,clearForm,clearFields的应用
Jan 23 Javascript
详解Javascript继承的实现
Mar 25 Javascript
JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
May 16 Javascript
JavaScript实现自动切换图片代码
Oct 11 Javascript
帝国cms首页列表页实现点赞功能
Oct 30 Javascript
JavaScript比较同一天的时间大小实例代码
Feb 09 Javascript
Node.js中你不可不精的Stream(流)
Jun 08 Javascript
vue指令做滚动加载和监听等
May 26 Javascript
vuex管理状态 刷新页面保持不被清空的解决方案
Nov 11 Javascript
原生JS实现圆环拖拽效果
Apr 07 #Javascript
Zepto实现密码的隐藏/显示
Apr 07 #Javascript
js按条件生成随机json:randomjson实现方法
Apr 07 #Javascript
详解JS中遍历语法的比较
Apr 07 #Javascript
JavaScript原生数组Array常用方法
Apr 06 #Javascript
微信小程序 图片宽度自适应的实现
Apr 06 #Javascript
微信小程序 下拉菜单的实现
Apr 06 #Javascript
You might like
雄兵连三大错觉:凯莎没了,凉冰阵亡了,华烨觉得自己又行了
2020/04/09 国漫
11个PHP 分页脚本推荐
2011/08/15 PHP
本地机apache配置基于域名的虚拟主机详解
2013/08/10 PHP
php导出word格式数据的代码实例
2013/11/25 PHP
PHP实现将上传图片自动缩放到指定分辨率,并保持清晰度封装类示例
2019/06/17 PHP
jQuery性能优化28条建议你值得借鉴
2013/02/16 Javascript
js的alert样式如何更改如背景颜色
2014/01/22 Javascript
JavaScript制作的可折叠弹出式菜单示例
2014/04/04 Javascript
利用javascript实现全部删或清空所选的操作
2014/05/27 Javascript
javascript使用正则获取url上的某个参数
2014/09/04 Javascript
js实现漂浮回顶部按钮实例
2015/05/06 Javascript
javascript实现网页字符定位的方法
2015/07/14 Javascript
javascript HTML+CSS实现经典橙色导航菜单
2016/02/16 Javascript
浅谈Angular中ngModel的$render
2016/10/24 Javascript
原生js简单实现放大镜特效
2017/05/16 Javascript
小程序自定义日历效果
2018/12/29 Javascript
vue实现点击隐藏与显示实例分享
2019/02/13 Javascript
用VueJS写一个Chrome浏览器插件的实现方法
2019/02/27 Javascript
[37:37]DAC2018 4.4 淘汰赛 Optic vs Mineski 第二场
2018/04/05 DOTA
Python常用随机数与随机字符串方法实例
2015/04/09 Python
Python编程之string相关操作实例详解
2017/07/22 Python
python解析html提取数据,并生成word文档实例解析
2018/01/22 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
2019/01/05 Python
python标识符命名规范原理解析
2020/01/10 Python
Python实现密钥密码(加解密)实例详解
2020/04/26 Python
TensorFlow Autodiff自动微分详解
2020/07/06 Python
Python限制内存和CPU使用量的方法(Unix系统适用)
2020/08/04 Python
Java中compareTo和compare的区别
2016/04/12 面试题
经典优秀个人求职信分享
2013/12/12 职场文书
团工委书记自荐书范文
2013/12/17 职场文书
装修施工安全责任书
2014/07/24 职场文书
满月酒邀请函
2015/01/30 职场文书
法律意见书范本
2015/06/04 职场文书
《怀念母亲》教学反思
2016/02/19 职场文书
小程序后台PHP版本部署运行 LNMP+WNMP
2021/04/01 Servers
详解CocosCreator消息分发机制
2021/04/16 Javascript