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学习笔记一 之 数据类型
Dec 15 Javascript
jQuery学习笔记之jQuery中的$
Jan 19 Javascript
JS实现简单路由器功能的方法
May 27 Javascript
EasyUi combotree 实现动态加载树节点
Apr 01 Javascript
MVC+jQuery.Ajax异步实现增删改查和分页
Dec 22 Javascript
jQuery实现按钮点击遮罩加载及处理完后恢复的效果
Jun 07 Javascript
jQuery快速实现商品数量加减的方法
Feb 06 Javascript
javascript 缓冲运动框架的实现
Sep 29 Javascript
JavaScript Canvas编写炫彩的网页时钟
Oct 16 Javascript
vue使用一些外部插件及样式的配置代码
Nov 18 Javascript
详解Typescript 内置的模块导入兼容方式
May 31 Javascript
JavaScript使用canvas绘制坐标和线
Apr 28 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
ThinkPHP 防止表单重复提交的方法
2011/08/08 PHP
微信公众平台开发实现2048游戏的方法
2015/04/15 PHP
JSON用法之将PHP数组转JS数组,JS如何接收PHP数组
2015/10/08 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
javascript firefox兼容ie的dom方法脚本
2008/05/18 Javascript
jquery属性选择器not has怎么写 行悬停高亮显示
2013/11/13 Javascript
给应用部分的js代码设定一个统一的入口
2014/06/15 Javascript
详解JS中Array对象扩展与String对象扩展
2016/01/07 Javascript
详解nodejs 文本操作模块-fs模块(三)
2016/12/22 NodeJs
js自定义Tab选项卡效果
2017/06/05 Javascript
node.js基于express使用websocket的方法
2017/11/09 Javascript
vue2.0之多页面的开发的示例
2018/01/30 Javascript
jQuery实现表单动态添加数据并提交的方法
2018/07/19 jQuery
通过js给网页加上水印背景实例
2019/06/17 Javascript
浅谈layui里的上传控件问题
2019/09/26 Javascript
vue-cli创建的项目中的gitHooks原理解析
2020/02/14 Javascript
详解vue修改elementUI的分页组件视图没更新问题
2020/11/13 Javascript
Python 如何访问外围作用域中的变量
2016/09/11 Python
Python基于Socket实现的简单聊天程序示例
2017/08/05 Python
使用Python的package机制如何简化utils包设计详解
2017/12/11 Python
火车票抢票python代码公开揭秘!
2018/03/08 Python
解决Python2.7中IDLE启动没有反应的问题
2018/11/30 Python
python实现双色球随机选号
2020/01/01 Python
详解python内置模块urllib
2020/09/09 Python
纯CSS3实现运行时钟的示例代码
2021/01/25 HTML / CSS
Carter’s OshKosh加拿大:购买婴幼儿服装和童装
2018/11/27 全球购物
教师学习培训邀请函
2014/02/04 职场文书
《一本男孩子必读的书》教学反思
2014/02/19 职场文书
计算机专业职业规划
2014/02/28 职场文书
学校师德承诺书
2014/05/23 职场文书
工作态度不好检讨书
2015/05/06 职场文书
北京爱情故事观后感
2015/06/12 职场文书
关于践行三严三实的心得体会
2016/01/05 职场文书
Golang全局变量加锁的问题解决
2021/05/08 Golang
MySQL 重写查询语句的三种策略
2021/05/10 MySQL
详解Java七大阻塞队列之SynchronousQueue
2021/09/04 Java/Android