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 相关文章推荐
用console.table()调试javascript
Sep 04 Javascript
JavaScript 数组- Array的方法总结(推荐)
Jul 21 Javascript
AngularJS中$http服务常用的应用及参数
Aug 22 Javascript
关于RequireJS的简单介绍即使用方法
Oct 20 Javascript
Vue组件模板形式实现对象数组数据循环为树形结构(实例代码)
Jul 31 Javascript
React教程之封装一个Portal可复用组件的方法
Jan 02 Javascript
深入理解Vue nextTick 机制
Apr 28 Javascript
关于Vue在ie10下空白页的debug小结
May 02 Javascript
vue-cli3跨域配置的简单方法
Sep 06 Javascript
Vue 封装防刷新考试倒计时组件的实现
Jun 05 Javascript
vue 组件简介
Jul 31 Javascript
Vue实现手机计算器
Aug 17 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无限分类的类
2007/01/02 PHP
FirePHP 推荐一款PHP调试工具
2011/04/23 PHP
PHP json_decode函数详细解析
2014/02/17 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
实例讲解php实现多线程
2019/01/27 PHP
解决Laravel blade模板转义html标签的问题
2019/09/03 PHP
Laravel框架实现文件上传的方法分析
2019/09/29 PHP
js实现的仿新浪微博完美的时间组件升级版
2011/12/20 Javascript
jquery 通过name快速取值示例
2014/01/24 Javascript
jquery引用方法时传递参数原理分析
2014/10/13 Javascript
使用js画图之圆、弧、扇形
2015/01/12 Javascript
js实现图片从左往右渐变切换效果的方法
2015/02/06 Javascript
JS实现对中文字符串进行utf-8的Base64编码的方法(使其与Java编码相同)
2016/06/21 Javascript
详解Sea.js中Module.exports和exports的区别
2017/02/12 Javascript
jQueryUI Sortable 应用Demo(分享)
2017/09/07 jQuery
vue页面切换到滚动页面显示顶部的实例
2018/03/13 Javascript
nodejs acl的用户权限管理详解
2018/03/14 NodeJs
教你搭建按需加载的Vue组件库(小结)
2019/07/29 Javascript
node爬取新型冠状病毒的疫情实时动态
2020/02/06 Javascript
VUE+elementui组件在table-cell单元格中绘制微型echarts图
2020/04/20 Javascript
使用python 爬虫抓站的一些技巧总结
2018/01/10 Python
widows下安装pycurl并利用pycurl请求https地址的方法
2018/10/15 Python
Python读取stdin方法实例
2019/05/24 Python
python pyinstaller 加载ui路径方法
2019/06/10 Python
int在python中的含义以及用法
2019/06/27 Python
Python使用itchat模块实现简单的微信控制电脑功能示例
2019/08/26 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
2020/03/14 Python
python 实现的IP 存活扫描脚本
2020/12/10 Python
String s = new String(“xyz”);创建了几个String Object?
2015/08/05 面试题
师范生实习的个人自我鉴定
2013/10/20 职场文书
大学生自荐书范文
2013/12/10 职场文书
结婚喜宴主持词
2014/03/14 职场文书
三十年同学聚会感言
2015/07/30 职场文书
教师培训学习心得体会
2016/01/21 职场文书
springboot使用Redis作缓存使用入门教程
2021/07/25 Redis
Java版 单机五子棋
2022/05/04 Java/Android