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控制HTML5的全屏操控,浏览器兼容的问题
Oct 10 Javascript
浅谈Vue.js
Mar 02 Javascript
jQuery实现对网页节点的增删改查功能示例
Sep 18 jQuery
详解使用Next.js构建服务端渲染应用
Jul 10 Javascript
vue移动端实现红包雨效果
Jun 23 Javascript
Vue项目pdf(base64)转图片遇到的问题及解决方法
Oct 19 Javascript
微信小程序扫描二维码获取信息实例详解
May 07 Javascript
Vue Router history模式的配置方法及其原理
May 30 Javascript
Openlayers实现地图全屏显示
Sep 28 Javascript
React实现动效弹窗组件
Jun 21 Javascript
Vue如何清空对象
Mar 03 Vue.js
Axios代理配置及封装响应拦截处理方式
Apr 07 Vue.js
原生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
mysql下创建字段并设置主键的php代码
2010/05/16 PHP
在PHP中使用反射技术的架构插件使用说明
2010/05/18 PHP
PHP数组及条件,循环语句学习
2012/11/11 PHP
PHP中使用sleep造成mysql读取失败的案例和解决方法
2014/08/21 PHP
laravel框架 laravel-admin上传图片到oss的方法
2019/10/13 PHP
How to Auto Include a Javascript File
2007/02/02 Javascript
JQuery小知识
2010/10/15 Javascript
Package.js  现代化的JavaScript项目make工具
2012/05/23 Javascript
js实现的折叠导航示例
2013/11/29 Javascript
jQuery拖动div、移动div、弹出层实现原理及示例
2014/04/08 Javascript
javascript 实现 原路返回
2015/01/21 Javascript
jQuery操作iframe中js函数的方法小结
2016/07/06 Javascript
js点击任意区域弹出层消失实现代码
2016/12/27 Javascript
使用jQuery操作DOM的方法小结
2017/02/27 Javascript
利用Node.js检测端口是否被占用的方法
2017/12/07 Javascript
angularjs 的数据绑定实现原理
2018/07/02 Javascript
微信小程序:数据存储、传值、取值详解
2019/05/07 Javascript
python 系统调用的实例详解
2017/07/11 Python
python音频处理用到的操作的示例代码
2017/10/27 Python
Python实现嵌套列表及字典并按某一元素去重复功能示例
2017/11/30 Python
解决django服务器重启端口被占用的问题
2019/07/26 Python
python调用支付宝支付接口流程
2019/08/15 Python
用纯css3实现的图片放大镜特效效果非常不错
2014/09/02 HTML / CSS
使用CSS3的ruby-position固定注音位置的用法示例
2016/07/05 HTML / CSS
详解HTML5如何使用可选样式表为网站或应用添加黑暗模式
2020/04/07 HTML / CSS
年度考核自我鉴定
2013/11/09 职场文书
教师找工作推荐信
2013/11/23 职场文书
公职人员索取回扣检举信
2014/04/04 职场文书
个人先进材料范文
2014/12/30 职场文书
挂职锻炼工作总结2015
2015/05/28 职场文书
体育部部长竞选稿
2015/11/21 职场文书
简历自我评价:教师师德表现自我评价
2019/04/24 职场文书
电脑关机速度很慢怎么办 提升电脑关机速度设置教程
2022/04/08 数码科技
vue判断按钮是否可以点击
2022/04/09 Vue.js
Golang ort 中的sortInts 方法
2022/04/24 Golang
详解Go语言中Get/Post请求测试
2022/06/01 Golang