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
2
3
...
10000
如果照文章开始那个概念来说,应该在1,5console出来之后等待5000ms之后2,3,4马上都执行,但实际上是2在执行的时候里面输出10000非常耗时,所以3,4必须等待,等2执行完之后才去执行,因此对3,4来说,并不止等待了5000,这里就有一个js引擎单线程执行队列的概念了。
1413438637059-----2
1
2
3
...
10000
1413438638368-----3
1413438638369-----4
再看一个实验:
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指定的方法,如果队列非空,引擎就从队列头取出一个任务,直到该任务处理完,即返回后引擎接着运行下一个任务,在任务没返回前队列中的其它任务是没法被执行的.
这样就清晰了许多了。
看到了网上的另外一个说法,觉得很科学:JavaScript引擎是单线程运行的,浏览器无论在什么时候都只且只有一个线程在运行JavaScript程序. setTimeout(method, n)则是在参数指定的时间后将待执行方法放到执行队列中, 如果队列中没有其他方法等待,则回立即执行setTimeout指定的方法,如果队列非空,引擎就从队列头取出一个任务,直到该任务处理完,即返回后引擎接着运行下一个任务,在任务没返回前队列中的其它任务是没法被执行的.
这样就清晰了许多了。