console.log(1);
setTimeout(function() {
console.log(2);
},0);
new Promise(function(resolve, reject) {
console.log(3);
for(let i = 1; i <= 100000; i++) {
if(i === 100000) {
resolve();
}
}
console.log(4);
});
setTimeout(function() {
console.log(5);
}, 0)
console.log(6);
当javascript运行时遇到setTimeout后其实会另开一条线程(刚刚不是说javascript是单线程的嘛?)。是的,没错javascript是单线程的,但是setTimeout会另开一个线程,这个线程依赖于某个计时装置,这时,javascript其实是不管setTimeout而继续往下进行的,而setTimeout也是独立的线程计时的。而javascript在运行完全部的代码后会回过头来重新检测自己的队列中有没待执行的命令或者函数,如果有就执行,没有就等待。直到有待执行的命令被加载进这个队列中然后执行。在这期间,setTimeout依赖的那个计时线程如果时间到了,那么它会把setTimeout中要执行的函数或者命令传送到javascript的等待队列中,等待javascript执行完命令后回头来检测等待队列中未执行的函数或命令。
console.log(1);
setTimeout(function() {
console.log(2);
},0);
new Promise(function(resolve, reject) {
console.log(3);
for(let i = 1; i <= 100000; i++) {
if(i === 100000) {
resolve();
setTimeout(function() {
console.log(7);
}, 0)
}
}
console.log(4);
});
setTimeout(function() {
console.log(5);
}, 0)
console.log(6);