var len=4;
while(len--){
  var time=setTimeout(function(){
    console.log(len);
  },0);
console.log(time);
};

控制台打印结果:

循环执行4次setTimeout给了4个ID,分别是1,2,3,4。而setTimeout函数是被放入函数队列中等待执行,虽然给予的间隔时间为0,但实际每个浏览器的最小间隔都不一样,小于那个值的时候,间隔数不确定。所以最后得出的结果是4个-1也就是循环执行完的结果,队列中放置了4个setTimeout函数。下面我们来测试,以chrome为例:

var startTime = new Date();
setTimeout(function () {
console.log(new Date() - startTime);
}, 100)

当为>100的时候,一直维持给定值。但若小于某个值则会随机给数,比如75,或者77。可以自己测试。具体规律还待研究。这个设定定时器的函数在队列中执行的真实时间间隔取决于后面同步执行的js需要占用多少时间,也即它既然在队列中,虽然设定了某值,但有可能超过这个时限才能执行。

setTimeout(function () {
func1();
}, 0)
func2(); 实例代码:

setTimeout(function(){
  (function(){console.log(1)})();
}, 0);
(function(){console.log(2)})();

请问谁先执行?根据前面的分析,func2肯定先执行,然后是func1。

再来一题

    setTimeout(function () {
func1()
}, 0)
和 setTimeout(function () {
func1()
})
有什么差别?

0秒延迟,此回调将会放到一个能立即执行的时段进行触发。javascript代码大体上是自顶向下的,但中间穿插着有关DOM渲染,事件回应等异步代码,他们将组成一个队列,零秒延迟将会实现插队操作。不写第二个参数,浏览器自动配置时间,在IE,FireFox中,第一次配可能给个很大的数字,100ms上下,往后会缩小到最小时间间隔,Safari,chrome,opera则多为10ms上下。

额外知识:《你真会用setTimeout吗?》《关于软件的生命周期》《JavaScript的setTimeout和setInterval的深入理解

JavaScript的setTimeout和setInterval的深入理解》这篇文章提到的几个知识点很好:

1.js是单线程。

2.setTimeout及setInterval只是伪异步,和伪多线程。

3.它的实现原理就是计算一个时间插入到代码队列中去,如果插入的代码前的执行不完,后面不会执行。

4.ajax实现的不过伪异步而已。

5.setTimeout函数的第一个参数将会在全局作用域内执行,因此参数内的 this 将会指向全局对象。

6.常犯的错误,setTimeout 函数的第一个参数指的是函数对象本身,不能写成类似 setTimeout(foo(), 1000),因为 foo() 是函数返回值,而不是 foo 本身。

7.即使回调函数的执行被阻塞,setInterval 函数依然会继续调用更多的回调函数。当间隔时间设置较小时,将会导致回调函数堆积。最简单且最可控的方式就是在回调函数内部使用 setTimeout 函数。

8.Javascript 中并没有内置的函数方法来清除所有的定时器(timeout 或 interval),不过我们可以使用一种暴力的方法来清除所有的定时器。

// clear "all" timeouts
for(var i = 1; i < 1000; i++) {
clearTimeout(i);
}

但是很明显,由于指定最大值的限制,还会有定时器没有被清除掉。由于 ID 会随着定时器被调用的增加而增加,因此更好的方法是记录下最大的 ID 并一起清除。

// clear "all" timeouts
var biggestTimeoutId = window.setTimeout(function(){}, 1),
i;
for(i = 1; i <= biggestTimeoutId; i++) {
clearTimeout(i);
}
9.不要使用字符串作为 setTimeout 或 setInterval 函数的参数,当需要向回调函数中传递参数时,我们可以用匿名函数的,在匿名函数内部执行回调函数。
另外,尽量避免使用 setInterval 函数,从而避免可能导致的回调函数堆积现象。
10.js高级编程里写的setTimeout的第一个参数需要“”包裹,实际运用过程好像函数名的话,无所谓。这里的“”也可以直接传递可以运行的js代码,类似eval()实现的功能。
11.
js定时器setTimeout(longPress,500);和setTimeout("longPress()",500),效果一样,推荐用前者,后者双重求值,类似的还有eval等。
12.
setTimeout((function(){
console.log("delayer:" + i);
})(),0);

调用setTimout的时候,相当于调用立刻执行函数返回的undefind。
												

setTimeout和setInterval定时器使用详解测试的更多相关文章

  1. 关于setTimeout()你所不知道的地方,详解setTimeout()

    关于setTimeout()你所不知道的地方,详解setTimeout() 前言:看了这篇文章,1.注意setTimeout引用的是全部变量还是局部变量了,当直接调用外部函数方法时,实际上函数内部的变 ...

  2. 前端开发:setTimeout与setInterval 定时器与异步循环数组

    前端开发:setTimeout与setInterval 定时器与异步循环数组 前言: 开通博客园三个月以来,随笔记录了工作中遇到的大大小小的难题,也看过无数篇令人启发的文章,我觉得这样的环境是极好的, ...

  3. 如何通过setTimeout理解JS运行机制详解

    setTimeout()函数:用来指定某个函数或某段代码在多少毫秒之后执行.它返回一个整数,表示定时器timer的编号,可以用来取消该定时器. 例子 ? 1 2 3 4 5 console.log(1 ...

  4. 第一节:setTimeout和setInterval定时器

    区别:  setInterval函数的用法与setTimeout完全一致,区别仅仅在于setInterval指定某个任务每隔一段时间就执行一次,也就是无限次的定时执行. 取消定时器:(clearTim ...

  5. Cortex-M0系统滴答定时器Systick详解

    上图是LPC1114系统滴答定时器(SysTick)的结构图.系统滴答定时器位于Cortex-M0内核中,也就是说,不论是LPC1114,还是其他的Cortex-M0内核单片机,都有这个系统定时器.其 ...

  6. linux系统编程之信号(八):三种时间结构及定时器setitimer()详解

    一,三种时间结构 time_t://seconds   struct timeval { long tv_sec; /* seconds */ long tv_usec; /* microsecond ...

  7. setInterval 与 clearInterval详解

    首先注意,setInterval与clearInterval都是直属于window对象的. 1.直接调用setInterval(即不通过函数调用) <div id="oDiv_show ...

  8. Corex-M0 系统嘀嗒定时器 Systick 详解

  9. Spring Quartz定时器 配置文件详解

    在JavaEE系统中,我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等.我们可以使用java.util.Timer结合java.util.TimerTask来完成这项工作,但 ...

随机推荐

  1. VS2010中dumpbin工具的使用

    用VS2010生成的.obj文件..lib库..dll库..exe执行文件,如果想查看其中这些文件或库包含了哪些函数以及相关的信息(符号清单),可以通过VS2010自带的dumpbin工具来完成. d ...

  2. entityframework学习笔记--008-实体数据建模基础之继承关系映射TPH

    Table per Hierarchy Inheritance 建模 1.让我们假设你有如图8-1中的表,Employee表包含hourly employees 和salaried employees ...

  3. Console.In.ReadToEnd() 控制台 输入完毕

    输入完数据后 按回车(另起一行) ctrl+z enter .......百度了半天 没百度到..最后还是google 强大..解决了问题 ..

  4. Flexible 弹性盒子模型之flex

    实例 让所有弹性盒模型对象的子元素都有相同的长度,忽略它们内部的内容: #main div { flex:1; } 复制 效果预览 浏览器支持 表格中的数字表示支持该属性的第一个浏览器的版本号. 紧跟 ...

  5. AlloyTouch Button插件-不再愁click延迟和点击态

    移动端不能使用click,因为click会有300ms.所有有了fastclick这样的解决方案.然后fastclick并没有解决点击态(用户点击的瞬间要有及时的外观变化反馈)的问题.hover会有不 ...

  6. MyEclipse web项目导入Eclipse,详细说明

    最近导入一个MyEclipse的项目,具体是:spring4.1的web项目,同时遇到了一些问题,总结一下. 1.进入项目目录,找到.project文件,打开.增加一个<buildCommand ...

  7. freeswitch嵌入python脚本

    操作系统:debian8.5_x64 freeswitch 版本 : 1.6.8 python版本:2.7.9 开启python模块 安装python lib库 apt-get install pyt ...

  8. 利用Sharding-Jdbc实现分表

    你们团队使用SpringMVC+Spring+JPA框架,快速开发了一个NB的系统,上线后客户订单跟雪花一样纷沓而来. 慢慢地,你的心情开始变差,因为客户和产品的抱怨越来越频繁,抱怨的最多的一个问题就 ...

  9. JAVA编程思想(第四版)学习笔记----11.5 List,11.6迭代器

    Collection类的层次结构图(来源与网络)如下所示: 接口:Iterator<T> public interface Iterable<T> Iterable<T& ...

  10. Akka初步介绍

    Akka可能很多人都没有用过,也不知道是什么,但如果说起Scala或Spark就有很多人都听说过或使用过 ,这里简单说下三者的关系Akka是使用Scala开发的,Spark中使用了Akka作为其消息的 ...