一、第一题
console.log(1);
setTimeout(function () {
console.log(2);
}, 0);
console.log(3);
上面这道题的结果比较简单,如下:
1 3 2
JavaScript 是单线程的,同一时间只能执行一个任务,前一个任务结束,才会执行后一个任务。但是,为了控制代码的执行顺序,JavaScript有一个任务队列。任务会按照他们被加入队列的顺序执行。
所有的任务都可以分为两种,一种同步任务,一种异步任务。
这里的setTimeout
就是一个异步任务。按照JavaScript单线程机制,从上到下执行,先执行console.log(1)
,然后执行到setTimeout
这个异步任务,异步任务要挂起,先不执行,往下走,执行同步任务console.log(3)
,执行完再去执行异步任务。
JavaScript运行机制执行过程中,优先处理同步任务,同步任务处理完,再去响应异步任务。
二、第二题
console.log(1);
setTimeout(function () {
console.log(2);
}, 0);
while (true) {
}
执行结果是:
1
按照JavaScript运行机制,同步任务执行,打印1,然后异步任务挂起,执行while循环语句,因为同步的循环条件一直满足,会一直执行,所以不会再回头执行setTimeout这个异步任务。
这一题考察的是异步任务的执行时间。
三、第三题
for (var i = 0; i<4; i++){
setTimeout(function(){
console.log(i);
}, 1000);
}
执行结果是:一秒后打印4个4
4 4 4 4
浏览器会有一个timer模块,主要处理setTimeout和setInterval,定时器到了时间,才会把相应的语句放到异步队列过程中。
for循环在执行过程中,setTimeout语句并没有放到执行队列中去,但定时器会记住这个任务,因为没到执行时间,同步任务for循环4个循环体很快就结束了,当时间到了,定时器会把setTimeout函数体放到异步队列中,异步队列等待事件循环(Event Loop )执行。
这一题考察的是异步任务的放入时间和执行时间。