JavaScript-执行机制

1.JavaScript是单线程的

JavaScript的线程要么在执行脚本,要么在进行浏览器渲染,然而这两者又相互作用,所以通过单线程来实现,这也可以解释为什么有事浏览器渲染会阻塞脚本的执行。

2.JavaScript是异步的

JavaScript的脚本执行是自上而下的,如果没有异步,上面冗长的脚本会阻塞下面脚本的执行,那么用户点击便不会有反应,这是不能接受的。

3.JavaScript通过事件循环实现异步

这里我们首先抛出结论,将JavaScript代码分为宏任务和微任务。
宏任务:整体JavaScript代码、setInterval、setTimeout
微任务:Promise、process.nextTick

当js引擎执行宏任务时,如果遇到微任务就将改任务添加到此宏任务的任务队列里面,当宏任务结束以后则开始处理所有的微任务。
当一个宏任务以及所有执行该宏任务时遇到的微任务都处理完后,执行下一个微任务。

下面是一道非常经典的面试题,相信很多读者以前都有见过。。。

setTimeout(function(){console.log(4)},0);
new Promise(function(resolve){
    console.log(1)
    for( var i=0 ; i<10000 ; i++ ){
        i==9999 && resolve()
    }
    console.log(2)
}).then(function(){
    console.log(5)
});
console.log(3);

咳咳,答案是 1、 2、 3、 5 、 4

接下来,让我们从头开始捋一下执行顺序。
首先是我们遇到的是setTimeout()函数,因为这是一个宏任务,所以我们将该任务加入下一次循环中。
然后是new Promise(),这是一个同步任务,所以我们直接执行。
接着是then(),这是一个微任务,所以我们将他加入到本次循环的末尾中去,所以显然他要在下次循环前执行,也就理所当然的会在setTimeout()之前执行。
最后是顺序执行的整体代码。

正是因为如上的执行机制,你最后会看到 1、2、3、 5、4的打印顺序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值