1. var len=4;
  2. while(len--){
  3.   var time=setTimeout(function(){
  4.     console.log(len);
  5.   },0);
  6. console.log(time);
  7. };

控制台打印结果:

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

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

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

  1. setTimeout(function () {
  2. func1();
  3. }, 0)
  4. func2();
  5.  
  6. 实例代码:

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

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

  1. 再来一题
  2.  
  3. setTimeout(function () {
  4. func1()
  5. }, 0)
  6.  
  7. setTimeout(function () {
  8. func1()
  9. })
  10. 有什么差别?

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),不过我们可以使用一种暴力的方法来清除所有的定时器。

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

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

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

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. intellij idea Jdk编译设置

    Idea加载多项目时因为不同JDK,经常出现JDK编译版本的问题,容易出现以下异常. 一.异常信息: Information:Using javac 1.8.0_91 to compile java ...

  2. vcredist_x64.exe vcredist_x86.exe 静默安装方法收集

    vcredist_x64.exe /install /quiet /norestart 更多方法参考如下: http://www.cnblogs.com/lidabo/archive/2013/01/ ...

  3. Scala Reflection - Mirrors,ClassTag,TypeTag and WeakTypeTag

    反射reflection是程序对自身的检查.验证甚至代码修改功能.反射可以通过它的Reify功能来实时自动构建生成静态的Scala实例如:类(class).方法(method).表达式(express ...

  4. python爬虫成长之路(一):抓取证券之星的股票数据

    获取数据是数据分析中必不可少的一部分,而网络爬虫是是获取数据的一个重要渠道之一.鉴于此,我拾起了Python这把利器,开启了网络爬虫之路. 本篇使用的版本为python3.5,意在抓取证券之星上当天所 ...

  5. Hibernate4.2.4入门(一)——环境搭建和简单例子

    一.前言 发下牢骚,这段时间要做项目,又要学框架,搞得都没时间写笔记,但是觉得这知识学过还是要记录下.进入主题了 1.1.Hibernate简介 什么是Hibernate?Hibernate有什么用? ...

  6. 让产品有效迭代,前端A/B Testing的简单实现

    A/B Testing简介 互联网产品的迭代速度很快,往往一周一小发布,一月一大发布,产品提出的种种需求,哪些改动是提升产品体验的,哪些是阻碍产品进步的,如果没有数据可以参考,仅仅是靠拍脑袋的话,对产 ...

  7. Linux命令-文件文本操作grep

    文件文本操作 grep 在文件中查找符合正则表达式条件的文本行 cut 截取文件中的特定字段 paste 附加字段 tr 字符转换或压缩 sort 调整文本行的顺序,使其符合特定准则 uniq 找出重 ...

  8. Java关键字final、static

    一.final根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. final ...

  9. iOS开发中的数学函数

    在iOS开发当中...我们往往会涉及到一些算法...为了节省一些时间...让APP很快地被开发出来...我们需要对各类函数有一定的了解...接下来...我把部分常用函数分享出来...希望能帮到大家.. ...

  10. 织梦Dedecms使用Nginx的安全设置

    首先需要说明的是,任何程序都是有漏洞的,我们需要做好一些必要的防范,来减少由于程序漏洞造成的损失.织梦的漏洞多,这个是很多人的想法.不过大家如果做好了织梦系统的文件夹权限什么的设置,很多漏洞也是用不上 ...