三道题学习JavaScript运行机制

一、第一题

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 )执行。

这一题考察的是异步任务的放入时间执行时间

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容