JS 深入理解setTimeout

来源:互联网 发布:良朴袜子 知乎 编辑:程序博客网 时间:2024/06/11 15:21

setTimeout(method, n);

以前在网上查到的setTimeout的概念是这样写的:setTimeout( ) 是属于 window 的 method, 但我们都是略去 window 这顶层物件名称, 这是用来设定一个时间, 时间到了, 就会执行一个指定的 method。但是真的是这样吗? 让我们来做个试验:

1.setTimeout(’alert("立即执行")‘, 0);真的立即(等待0秒)执行了吗?

这个答案是否定的,上code:

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

如果按照上面的理解,那么这段代码执行的时候在控制台打印出的应该是“1 2 3”,但实际上是“1,3,2”。

2.setTimeout('alert("5000ms了")', 5000);真的是等了5000ms马上就执行了吗?,如果设置三个setTimeout在同一代码块都等待了5000ms,但第一个操作特别耗时会是怎么样?

function getSq() {console.log(new Date().getTime() + "-----1");setTimeout('console.log(new Date().getTime() + "-----2"); for(var i=0; i<=10000;i++){console.log(i);}', 5000);setTimeout('console.log(new Date().getTime()+ "-----3");', 5000);setTimeout('console.log(new Date().getTime()+ "-----4");', 5000);console.log(new Date().getTime()+ "-----5");}

1413438632045-----1
1413438632052-----5
1413438637059-----2
1
2
3
...
10000
1413438638368-----3
1413438638369-----4
如果照文章开始那个概念来说,应该在1,5console出来之后等待5000ms之后2,3,4马上都执行,但实际上是2在执行的时候里面输出10000非常耗时,所以3,4必须等待,等2执行完之后才去执行,因此对3,4来说,并不止等待了5000,这里就有一个js引擎单线程执行队列的概念了。

再看一个实验:

function getSq() {console.log(new Date().getTime() + "-----1");setTimeout('console.log(new Date().getTime() + "-----2"); setTimeout(function(){console.log(new Date().getTime() + "-----2-1");},8000)', 5000);setTimeout('console.log(new Date().getTime()+ "-----3");', 5000);setTimeout('console.log(new Date().getTime()+ "-----4");', 5000);console.log(new Date().getTime()+ "-----5");}

1413437861781-----1
1413437861785-----5
1413437866789-----2
1413437866804-----3
1413437866811-----4
1413437874802-----2-1 -------------------------------->在2之后等了差不多8000ms//

看到了网上的另外一个说法,觉得很科学:JavaScript引擎是单线程运行的,浏览器无论在什么时候都只且只有一个线程在运行JavaScript程序. setTimeout(method,  n)则是在参数指定的时间后将待执行方法放到执行队列中, 如果队列中没有其他方法等待,则回立即执行setTimeout指定的方法,如果队列非空,引擎就从队列头取出一个任务,直到该任务处理完,即返回后引擎接着运行下一个任务,在任务没返回前队列中的其它任务是没法被执行的.

这样就清晰了许多了。

0 0
原创粉丝点击