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 相关文章推荐
用htc组件制作windows选项卡
Jan 13 Javascript
JavaScript中的eval()函数详解
Aug 22 Javascript
通过js获取div的background-image属性
Oct 15 Javascript
JS的参数传递示例介绍
Feb 08 Javascript
JavaScript通过正则表达式实现表单验证电话号码
Mar 07 Javascript
jquery学习总结(超级详细)
Sep 04 Javascript
简单实现异步编程promise模式
Jul 31 Javascript
jQuery Easyui快速入门教程
Aug 21 Javascript
js仿微博动态栏功能
Feb 22 Javascript
详解angular部署到iis出现404解决方案
Aug 14 Javascript
微信小程序自定义组件传值 页面和组件相互传数据操作示例
May 05 Javascript
webpack优化之代码分割与公共代码提取详解
Nov 22 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输出指定时间以前时间格式的方法
2015/03/21 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
js数值计算时使用parseInt进行数据类型转换(jquery)
2014/10/07 Javascript
JQuery显示隐藏DIV的方法及代码实例
2015/04/16 Javascript
javascript日期验证之输入日期大于等于当前日期
2015/12/13 Javascript
AngularJS 遇到的小坑与技巧小结
2016/06/07 Javascript
JavaScript结合HTML DOM实现联动菜单
2017/04/05 Javascript
js实时监控文本框输入字数的实例代码
2018/01/18 Javascript
解决Vue2.0 watch对象属性变化监听不到的问题
2018/09/11 Javascript
Emberjs 通过 axios 下载文件的方法
2019/09/03 Javascript
vue 对axios get pust put delete封装的实例代码
2020/01/05 Javascript
Node.js创建一个Express服务的方法详解
2020/01/06 Javascript
微信小程序仿抖音视频之整屏上下切换功能的实现代码
2020/05/24 Javascript
Vue实现跑马灯效果
2020/05/25 Javascript
在vue中axios设置timeout超时的操作
2020/09/04 Javascript
[07:47]DOTA2国际邀请赛采访专栏:探访Valve总部
2013/08/08 DOTA
用Python编写一个简单的俄罗斯方块游戏的教程
2015/04/03 Python
Python每天必学之bytes字节
2016/01/28 Python
Python判断列表是否已排序的各种方法及其性能分析
2016/06/20 Python
20招让你的Python飞起来!
2016/09/27 Python
python使用pdfminer解析pdf文件的方法示例
2018/12/20 Python
selenium+python自动化测试之多窗口切换
2019/01/23 Python
在Pycharm中使用GitHub的方法步骤
2019/06/13 Python
对Django 中request.get和request.post的区别详解
2019/08/12 Python
python自动循环定时开关机(非重启)测试
2019/08/26 Python
torch 中各种图像格式转换的实现方法
2019/12/26 Python
Expedia加拿大官方网站:加拿大最大的在线旅游提供商
2017/12/31 全球购物
十月份红领巾广播稿
2014/01/22 职场文书
开工仪式主持词
2014/03/20 职场文书
上课玩手机的检讨书
2014/10/01 职场文书
党员群众路线剖析材料
2014/10/08 职场文书
毕业生就业推荐表自我评价
2015/03/02 职场文书
运动会800米赞词
2015/07/22 职场文书
银行安全保卫工作总结
2015/08/10 职场文书
MySQL Shell的介绍以及安装
2021/04/24 MySQL
详解运行Python的神器Jupyter Notebook
2021/06/03 Python