(一)js引擎机制的变化
在了解js引擎机制前,我们先来看这段代码,大家认为这段代码的结果是什么呢?
<body>
<button>点击</button>
<script>
console.log(1);
document.querySelector('button').addEventListener('click', function () {
console.log(2);
})
setTimeout(() => {
console.log(3);
}, 10000)
console.log(4);
</script>
</body>
在了解具体的执行结果之前,我们先说说js引擎机制的变化,最开始的js引擎机制是同步的,随着时代的发展,js引擎机制引入了异步,那么有小伙伴就问了,什么是引擎?什么是同步和异步?接下来,咱们废话不多说,直接进入到主题
(二)何为Js引擎机制
JavaScript引擎是专门处理JavaScript脚本的虚拟机。它的主要功能是将JavaScript代码编译为不同CPU对应的汇编代码,并负责执行代码、分配内存以及垃圾回收等。在早期引擎编译代码的过程中,采取同步的方式,也就是说是从上往下的顺序依次执行的,这样的方式有很大的缺点,必须要等上一个任务执行完,才能执行下一个任务,这样的编译方式会带来资源的浪费,所以后来就加入了异步
(三)何为同步和异步
在早期引擎编译代码的过程中,采取同步的方式,也就是说是从上往下的顺序依次执行的,这样的方式有很大的缺点,必须要等上一个任务执行完,才能执行下一个任务,这样的编译方式会带来资源的浪费,所以后来就加入了异步
何为同步
同步操作指的是在执行某个任务时,必须等待这个任务完成后才能继续执行下一个任务。这种模式下,任务按顺序逐一执行,前一个任务未完成时,后续任务必须等待。这就像是排队等候服务,前面的人未完成业务,后面的人无法进行。同步操作通常是阻塞的,即在等待任务完成的过程中,程序不会执行其他任务,这可能会导致资源的浪费,尤其是在等待某些耗时操作(如I/O操作)时。
假设你正在准备一顿晚餐,需要完成洗菜、切菜、炒菜等一系列步骤。在同步模式下,你会按照顺序一步一步来完成这些任务:
- 洗菜:你先把所有的菜都洗干净,放在一边。
- 切菜:接着,你把洗好的菜切成需要的形状和大小。
- 炒菜:最后,你开始炒菜,按照菜谱的顺序依次放入食材,翻炒至熟。
在这个过程中,每一步都必须等待前一步完成才能进行下一步。比如,你不能在菜还没洗完的时候就开始切菜,也不能在菜还没切好的时候就开始炒菜。这种按照顺序一步一步来,前一步完成后才能进行下一步的方式,就是同步。
何为异步
异步操作则允许在执行一个任务时不必等待它完成就可以继续执行其他任务。这种模式下,可以同时处理多个任务,提高了程序的效率和响应速度。当一个异步任务完成时,系统会通知相应的程序进行后续处理。异步操作通常是非阻塞的,即程序可以在等待一个任务完成的同时,继续执行其他任务。如果还是不清楚的话,和同步一样举个洗菜做饭的例子
现在,想象一下你和你妈妈一起准备晚餐。你们决定分工合作:
- 洗菜:你开始洗菜,而你的妈妈则在一旁准备其他工具或食材。
- 切菜(同时):在你洗菜的同时,妈妈可以开始切一些已经洗好的菜(或者等你洗完一部分后就开始切)。
- 炒菜(等待):当你们洗完并切好所有的菜后,妈妈可以开始炒菜,而你则可以开始清理厨房或准备餐具。
在这个过程中,你和妈妈可以同时进行不同的任务,而不需要等待对方完成。当某个任务完成后(比如你洗完菜了),下一个任务(比如助手开始切菜)可以立即开始,而不需要你亲自去触发。这种可以同时进行多个任务,不需要严格按照顺序等待的方式,就是异步。
(四)同步和异步的区别
- 同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。
- 异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。而,异步方法通常会在另外一个线程中,“真实”地执行着。整个过程,不会阻碍调用者的工作
(五)Js执行代码的过程
说完了异步和同步,我们一起来看看文章开头提出的代码,js引擎机制是怎么来编译代码
js引擎机制是同步操作的,从上往下执行,当遇到异步事件(点击事件,延迟函数等)时,js引擎会把异步事件拿到异步中
此时,js引擎机制就先从上到下的顺序先执行同步里面的,等同步里面执行完之后,在执行异步里面的,异步里的异步事件谁先执行,就把执行结果传到同步里面,假设我们的点击事件比延迟函数先执行,我们此时的js引擎机制会把点击事件执行好的结果传到同步里面
此时,同步里面执行后的结果为
最后,等延迟函数执行完之后,把输出的结果传到同步栈里面来,最终控制台里面打印的结果就是
那么,如果是延迟函数比点击事件先执行,控制台打印的结果就是
客官你想的答案和咱们控制台打印的结果符合吗,如果符合,恭喜客官了喔
(五)总结
js引擎编译代码的时候,遇到异步事件,就把异步事件调到异步里面执行。等同步执行完之后,就开始执行异步,谁先执行,就把谁的输出结果返回到同步里,并排在最后。
版权归原作者 涛涛云码 所有, 如有侵权,请联系我们删除。