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 CSS修改学习第五章 给“上传”添加样式
Feb 19 Javascript
JS两种定义方式的区别、内部原理
Nov 21 Javascript
jQuery中选择器小问题(新人难免遇到)
Mar 31 Javascript
input标签内容改变的触发事件介绍
Jun 18 Javascript
全面解析node 表单的图片上传
Nov 21 Javascript
bootstrapValidator自定验证方法写法
Dec 01 Javascript
手机端js和html5刮刮卡效果
Sep 29 Javascript
老生常谈jacascript DOM节点获取
Apr 17 Javascript
vue+element-ui集成随机验证码+用户名+密码的form表单验证功能
Aug 05 Javascript
一次微信小程序内地图的使用实战记录
Sep 09 Javascript
vue中使用element组件时事件想要传递其他参数的问题
Sep 18 Javascript
使用Karma做vue组件单元测试的实现
Jan 16 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
Zend 输出产生XML解析错误
2009/03/03 PHP
php在linux下检测mysql同步状态的方法
2015/01/15 PHP
PHP实现websocket通信的方法示例
2018/08/28 PHP
PHP的静态方法与普通方法用法实例分析
2019/09/26 PHP
利用javascript查看html源文件
2006/11/08 Javascript
IE6下通过a标签点击切换图片的问题
2010/11/14 Javascript
Jquery 表格合并的问题分享
2011/09/17 Javascript
js实现瀑布流的一种简单方法实例分享
2013/11/04 Javascript
改变隐藏的input中value值的方法
2014/03/19 Javascript
利用jquery动画特效和css打造的侧边弹出垂直导航
2014/04/04 Javascript
Javascript中封装window.open解决不兼容问题
2014/09/28 Javascript
基于jquery编写分页插件
2016/03/07 Javascript
JavaScript中的ajax功能的概念和示例详解
2016/10/17 Javascript
使用ionic在首页新闻中应用到的跑马灯效果的实现方法
2017/02/13 Javascript
Angular.js自动化测试之protractor详解
2017/07/07 Javascript
Node.js+Express+MySql实现用户登录注册功能
2017/07/10 Javascript
使用Ajax和Jquery配合数据库实现下拉框的二级联动的示例
2018/01/25 jQuery
JS中promise化微信小程序api
2018/04/12 Javascript
layui问题之模拟table表格中的选中按钮选中事件的方法
2019/09/20 Javascript
构建大型 Vue.js 项目的10条建议(小结)
2019/11/14 Javascript
快速了解Vue父子组件传值以及父调子方法、子调父方法
2020/07/15 Javascript
VUE使用axios调用后台API接口的方法
2020/08/03 Javascript
[00:12]2018DOTA2亚洲邀请赛 Somnus丶M出阵单挑
2018/04/06 DOTA
Python PyCharm如何进行断点调试
2019/07/05 Python
pandas read_excel()和to_excel()函数解析
2019/09/19 Python
pytorch中的卷积和池化计算方式详解
2020/01/03 Python
python 写函数在一定条件下需要调用自身时的写法说明
2020/06/01 Python
浅谈HTML5新增及移除的元素
2016/06/27 HTML / CSS
压铸汽车模型收藏家:Diecastmodelswholesale.com
2016/12/21 全球购物
小学生家长评语大全
2014/02/10 职场文书
缓刑人员思想汇报
2014/10/11 职场文书
导游词之河北白洋淀
2020/01/15 职场文书
SQL实战演练之网上商城数据库商品类别数据操作
2021/10/24 MySQL
十大最强飞行系宝可梦,BUG燕上榜,第二是飞行系王者
2022/03/18 日漫
如何在Python中妥善使用进度条详解
2022/04/05 Python
Valheim服务器 Mod修改安装教程 【ValheimPlus】
2022/12/24 Servers