JavaScript学习笔记整理_setTimeout的应用


Posted in Javascript onSeptember 19, 2016

setTimeou的t应用

var ids = [];
function foo1(i) {
  this.i = i;
  console.log('i = '+i);
  ids[0] = setTimeout((function () {
    foo1(i);
  }),1000);
}
function foo2(j) {
  this.j = j;
  console.log('j = '+j);
  ids[1] = setTimeout((function () {
    foo2(j);
  }),1000);
}
foo1(2);
foo2(3);
clearTimeout(ids[0]);
clearTimeout(ids[1]);

当 setTimeout(f,n) 被调用时,它会返回一个 ID 标识并且计划在将来大约n毫秒后调用f函数。 f函数只会被执行一次(递归执行的话就可以实现每n毫秒执行一次),基于 JavaScript 引擎的计时策略,以及本质上的单线程运行方式,所以其它代码的运行可能会阻塞此线程。 因此没法确保函数会在 setTimeout 指定的时刻被调用。通过在回调函数内部使用 setTimeout 函数来防止阻塞!

JavaScript 是异步的,setTimeout 只会执行回调函数一次,不过 setInterval会每隔 X 毫秒执行函数一次。 但是却不鼓励使用这个函数。当回调函数的执行被阻塞时,setInterval 仍然会发布更多的回调指令。在很小的定时间隔情况下,这会导致回调函数被堆积起来。

setTimeout 和 setInterval 也接受第一个参数为字符串的情况。 这个特性绝对不要使用,因为它在内部使用了隐藏的eval,由于 eval 在这种情况下不是被直接调用,因此传递到 setTimeout 的字符串会自全局作用域中执行,建议不要在调用定时器函数时,为了向回调函数传递参数而使用字符串的形式;当需要向回调函数传递参数时,可以创建一个匿名函数,在函数内执行真实的回调函数;

onscolll,onresize等是非常耗性能,那如果我们换成ajax请求的话,那么就会缩放一次窗口会连续触发多次ajax请求,下面我们试着使用函数节流的操作试试一下;当然加个settimeout()的定时器就好了,

第一种封装方法

var count = 0;
function oCount() {
  count++;
  console.log(count);
}
window.onresize = function () {
  delayFun(oCount)
};

function delayFun(method, thisArg) {
  clearTimeout(method.props);
  method.props = setTimeout(function () {
    method.call(thisArg)
  }, 200)
}

第二种封装方法

构造一个闭包,使用闭包的方式形成一个私有的作用域来存放定时器timer, timer是通过传参数的形式引入的。

var count = 0;
function oCount() {
  count++;
  console.log(count);
}
var funs= delayFun(oCount,100);
window.onresize = function () {
  funs()
};

function delayFun(func, wait) {
  var timer = null;
  return function () {
    var context = this,
      args = arguments;
    clearTimeout(timer);
    timer = setTimeout(function () {
      func.apply(context, args);
    }, wait)
  };
}

对第二种方法优化一下,性能会更好

这里返回一个函数,如果它被不间断地调用,它将不会得到执行。该函数在停止调用 N 毫秒后,再次调用它才会得到执行。如果有传递 ‘immediate' 参数,会马上将函数安排到执行队列中,而不会延迟。

function delayFun (func, wait, immediate) {
  var timeout;
  return function() {
    var context = this, args = arguments;
    var later = function() {
      timeout = null;
      if (!immediate) func.apply(context, args);
    };
    var callNow = immediate && !timeout;
    clearTimeout(timeout);
    timeout = setTimeout(later, wait);
    if (callNow) func.apply(context, args);
  };
};

// 用法
var myEfficientFn = delayFun (function() {
  // 所有繁重的操作
}, 250);
window.addEventListener('resize', myEfficientFn);

函数不允许回调函数在指定时间内执行多于一次。当为一个会频繁触发的事件分配一个回调函数时,该函数显得尤为重要。

setTimeout这么厉害,那么我们是可以在项目中大量使用吗?

我个人是不建议的,在我们业务中,基本上是禁止在业务逻辑中使用setTimeout的,因为我所看到的很多使用方式都是一些问题不好解决,setTimeout作为一个hack的方式。

例如,当一个实例还没有初始化的前,我们就使用这个实例,错误的解决办法是使用实例时加个setTimeout,确保实例先初始化。

为什么错误?这里其实就是使用hack的手段

第一是埋下了坑,打乱模块的生命周期

第二是出现问题时,setTimeout其实是很难调试的。

我认为正确的使用方式是,看看生命周期(可参考《关于软件的生命周期 》),把实例化提到使用前执行

以上就是小编为大家带来的JavaScript学习笔记整理_setTimeout的应用的全部内容了,希望对大家有所帮助,多多支持三水点靠木~

Javascript 相关文章推荐
javascript闭包的高级使用方法实例
Jul 04 Javascript
基于JavaScript 下namespace 功能的简单分析
Jul 05 Javascript
JS动态增加删除UL节点LI及相关内容示例
May 21 Javascript
JavaScript实现列出数组中最长的连续数
Dec 29 Javascript
微信小程序 wx.request(OBJECT)发起请求详解
Oct 13 Javascript
angularjs实现搜索的关键字在正文中高亮出来
Jun 13 Javascript
深入理解ES6学习笔记之块级作用域绑定
Aug 19 Javascript
利用JS判断客户端类型你应该知道的四种方法
Dec 22 Javascript
vue打包的时候自动将px转成rem的操作方法
Jun 20 Javascript
简述vue-cli中chainWebpack的使用方法
Jul 30 Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
Dec 11 Javascript
Vant picker 多级联动操作
Nov 02 Javascript
Node.js + Redis Sorted Set实现任务队列
Sep 19 #Javascript
JavaScript学习笔记整理_用于模式匹配的String方法
Sep 19 #Javascript
JavaScript学习笔记整理_简单实现枚举类型,扑克牌应用
Sep 19 #Javascript
JavaScript学习笔记整理_关于表达式和语句
Sep 19 #Javascript
javascript学习笔记_浅谈基础语法,类型,变量
Sep 19 #Javascript
js中用cssText设置css样式的简单方法
Sep 19 #Javascript
Query常用DIV操作获取和设置长度宽度的实现方法
Sep 19 #Javascript
You might like
PHP性能优化大全(php.ini)
2016/05/20 PHP
PHP Class SoapClient not found解决方法
2018/01/20 PHP
js用图作提交按钮或超连接
2008/03/26 Javascript
js代码实现的加入收藏效果并兼容主流浏览器
2014/06/23 Javascript
Javascript vue.js表格分页,ajax异步加载数据
2016/10/24 Javascript
Angular.js 4.x中表单Template-Driven Forms详解
2017/04/25 Javascript
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
2017/09/21 Javascript
在 React、Vue项目中使用SVG的方法
2018/02/09 Javascript
angularJS实现动态添加,删除div方法
2018/02/27 Javascript
在Vue 中使用Typescript的示例代码
2018/09/10 Javascript
js自定义input文件上传样式
2018/10/26 Javascript
jQuery使用$.extend(true,object1, object2);实现深拷贝对象的方法分析
2019/03/06 jQuery
mpvue实现左侧导航与右侧内容的联动
2019/10/21 Javascript
vue quill editor 使用富文本添加上传音频功能
2020/01/14 Javascript
OpenLayers3加载常用控件使用方法详解
2020/09/25 Javascript
python的id()函数解密过程
2012/12/25 Python
Python魔法方法详解
2019/02/13 Python
python图像处理入门(一)
2019/04/04 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
2020/01/20 Python
python连接打印机实现打印文档、图片、pdf文件等功能
2020/02/07 Python
python为什么要安装到c盘
2020/07/20 Python
python 中关于pycharm选择运行环境的问题
2020/10/31 Python
Python关于拓扑排序知识点讲解
2021/01/04 Python
Python如何使用神经网络进行简单文本分类
2021/02/25 Python
CSS3实现文字描边的2种方法(小结)
2020/02/14 HTML / CSS
享受加州生活方式的时尚舒适:XCVI
2018/07/09 全球购物
RIP版本1跟版本2的区别
2013/12/30 面试题
如何通过jdbc调用存储过程
2012/04/19 面试题
小学生校园广播稿
2014/09/28 职场文书
公安机关查摆剖析材料
2014/10/10 职场文书
简易离婚协议书范本
2014/10/24 职场文书
2016民族团结先进个人事迹材料
2016/02/26 职场文书
汽车销售合同文本
2019/08/08 职场文书
基于nginx实现上游服务器动态自动上下线无需reload的实现方法
2021/03/31 Servers
Win11怎么进入安全模式?Windows 11进入安全模式的方法
2021/11/21 数码科技
css3属性选择器 “~”(波浪号) “,”(逗号) “+”(加号)和 “>”(大于号)
2022/04/19 HTML / CSS