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 相关文章推荐
Cookie 注入是怎样产生的
Apr 08 Javascript
jQuery之浮动窗口实现代码(两种方法)
Sep 08 Javascript
23个Javascript弹出窗口特效整理
Feb 25 Javascript
jQuery on()方法绑定动态元素的点击事件实例代码浅析
Jun 16 Javascript
JS选取DOM元素的简单方法
Jul 08 Javascript
JS获取和修改元素样式的实例代码
Aug 06 Javascript
基于jQuery实现火焰灯效果导航菜单
Jan 04 Javascript
一个可复用的vue分页组件
May 15 Javascript
基于javaScript的this指向总结
Jul 22 Javascript
Angularjs 1.3 中的$parse实例代码
Sep 14 Javascript
详解JavaScript基础知识(JSON、Function对象、原型、引用类型)
Jan 16 Javascript
JavaScript常见鼠标事件与用法分析
Jan 03 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
Windows Server 2008 R2和2012中PHP连接MySQL过慢的解决方法
2016/07/02 PHP
laravel-admin的图片删除实例
2019/09/30 PHP
php 中的信号处理操作实例详解
2020/03/04 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
2020/04/14 PHP
JavaScript 对象成员的可见性说明
2009/10/16 Javascript
javascript 动态修改样式和层叠样式表代码
2010/04/27 Javascript
JavaScript 面向对象的 私有成员和公开成员
2010/05/13 Javascript
Jquery插件编写简明教程
2014/03/25 Javascript
PHPMyAdmin导入时提示文件大小超出PHP限制的解决方法
2015/03/30 Javascript
javascript高级编程之函数表达式 递归和闭包函数
2015/11/29 Javascript
javascript精确统计网站访问量实例代码
2015/12/19 Javascript
jQuery设置Cookie及删除Cookie实例分析
2016/04/15 Javascript
jQuery实现简单倒计时功能的方法
2016/07/04 Javascript
前端JS面试中常见的算法问题总结
2016/12/23 Javascript
Javascript中click与blur事件的顺序详析
2017/04/25 Javascript
Vue关于数据绑定出错解决办法
2017/05/15 Javascript
AngularJS ng-repeat指令及Ajax的应用实例分析
2017/07/06 Javascript
Vue实现调节窗口大小时触发事件动态调节更新组件尺寸的方法
2018/09/15 Javascript
JS/CSS实现字符串单词首字母大写功能
2019/09/03 Javascript
使用JavaScrip模拟实现仿京东搜索框功能
2019/10/16 Javascript
微信小程序搜索框样式并实现跳转到搜索页面(小程序搜索功能)
2020/03/10 Javascript
Python 模拟购物车的实例讲解
2017/09/11 Python
详解python Todo清单实战
2018/11/01 Python
python实时获取外部程序输出结果的方法
2019/01/12 Python
解决Django中多条件查询的问题
2019/07/18 Python
python切片(获取一个子列表(数组))详解
2019/08/09 Python
比较一下entity bean和session bean
2013/12/27 面试题
军训自我鉴定
2014/01/22 职场文书
园艺师求职信
2014/03/10 职场文书
委托书模板
2014/04/04 职场文书
秘书英文求职信
2014/04/16 职场文书
新农村建设典型材料
2014/05/31 职场文书
积极向上的团队口号
2014/06/06 职场文书
大学生自荐信范文
2015/03/05 职场文书
电力工程合作意向书
2015/05/11 职场文书
催款函范文
2015/06/24 职场文书