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的打印顺序。

你可能感兴趣的:(JavaScript)