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 相关文章推荐
Jquery validation remote 验证的缓存问题解决方法
Mar 25 Javascript
JS烟花背景效果实现方法
Mar 03 Javascript
超链接怎么正确调用javascript函数
May 23 Javascript
jQuery实现鼠标选中文字后弹出提示窗口效果【附demo源码】
Sep 05 Javascript
javaScript中定义类或对象的五种方式总结
Dec 04 Javascript
详解JS中的this、apply、call、bind(经典面试题)
Sep 19 Javascript
JavaScript变量声明var,let.const及区别浅析
Apr 23 Javascript
vue生成token并保存到本地存储中
Jul 17 Javascript
vuedraggable+element ui实现页面控件拖拽排序效果
Jul 29 Javascript
vue实现分页组件
Jun 16 Javascript
vue3.0中的双向数据绑定方法及优缺点
Aug 01 Javascript
浅谈node.js中间件有哪些类型
Apr 29 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
一个PHP分页类的代码
2011/05/18 PHP
Trying to clone an uncloneable object of class Imagic的解决方法
2012/01/11 PHP
PHP编码规范的深入探讨
2013/06/06 PHP
smarty模板局部缓存方法使用示例
2014/06/17 PHP
jQuery 事件队列调整方法
2009/09/18 Javascript
15 个 JavaScript Web UI 库
2010/05/19 Javascript
js判断输入是否为正整数、浮点数等数字的函数代码
2010/11/17 Javascript
javascript中的document.open()方法使用介绍
2013/10/09 Javascript
Juery解决tablesorter中文排序和字符范围的方法
2015/05/06 Javascript
jquery实现树形菜单完整代码
2015/12/29 Javascript
jquery插件方式实现table查询功能的简单实例
2016/06/06 Javascript
原生js实现吸顶效果
2017/03/13 Javascript
前端常见跨域解决方案(全)
2017/09/19 Javascript
Vue.js实现列表清单的操作方法
2017/11/15 Javascript
Nodejs连接mysql并实现增、删、改、查操作的方法详解
2018/01/04 NodeJs
vue的安装及element组件的安装方法
2018/03/09 Javascript
JS扩展String.prototype.format字符串拼接的功能
2018/03/09 Javascript
浅谈KOA2 Restful方式路由初探
2019/03/14 Javascript
jQuery实现的点击显示隐藏下拉菜单功能完整示例
2019/05/17 jQuery
mpvue实现小程序签到金币掉落动画(api实现)
2019/10/17 Javascript
html+vue.js 实现漂亮分页功能可兼容IE
2020/11/07 Javascript
python获取beautifulphoto随机某图片代码实例
2013/12/18 Python
Python下载网络文本数据到本地内存的四种实现方法示例
2018/02/05 Python
Django项目中model的数据处理以及页面交互方法
2018/05/30 Python
python多维数组分位数的求取方式
2020/03/03 Python
Python序列化pickle模块使用详解
2020/03/05 Python
浅谈Python中文件夹和python package包的区别
2020/06/01 Python
python openCV实现摄像头获取人脸图片
2020/08/20 Python
Vilebrequin欧洲官网:法国豪华泳装品牌(男士沙滩裤)
2018/04/14 全球购物
Craghoppers德国官网:户外和旅行服装
2020/02/14 全球购物
马云北大演讲完整版:真心话,什么才是阿里的核心竞争力?
2014/04/04 职场文书
祖国在我心中的演讲稿
2014/05/04 职场文书
警示教育活动总结
2014/05/05 职场文书
世界文化遗产导游词
2015/02/13 职场文书
学生会干部任命书
2015/09/21 职场文书
宣传部部长竞选稿
2015/11/21 职场文书