解释性语言和编译性语言&JS的事件轮询介绍

一. 解释性语言和编译语言介绍
JavaScript是一门解释性语言,也是一门单线程语言。
何谓解释性语言?将高级语言翻译为机器语言有两种方式:解释和编译。
----解释性语言如Java/c#,在程序运行时开始翻译,效率较低但可以跨平台,只要平台提供解释器就可以运行源码。Java虽然是解释性语言但是Java代码需要编译成.class字节码文件,若要执行Java代码还需要Jvm的解释才可以。
可参考https://blog.csdn.net/qzc70919700/article/details/72515022
JavaScript、PHP是脚本语言也是解释性语言(因为脚本语言是一种解释性语言),脚本语言不需要编译,可以直接用,只要有解释器负责解释。JavaScript语言的解释器是JavaScript引擎,为浏览器的一部分。

----编译性语言如c/c++,将源码在编译的时候先统一翻译为机器可以执行的二进制文件如.exe文件,再由机器运行。不能跨平台,但是可以直接用.exe运行,效率高因为只翻译了一次。
在这里插入图片描述
具体可参考https://blog.csdn.net/u014647208/article/details/78329187

二. 微任务和宏任务
所谓 单线程是指主线程是单线程的。JS中也有异步的概念,比如定时器线程、ajax线程等,这些异步操作的出现就是为了解决在单线程下代码执行的等待问题,因为单线程下的代码是一行一行往下执行,万一代码执行时间太久,那么后面所有的操作都必须等待前面执行完才能进行。

javascript代码执行时有两个区域,一个是同步代码执行区域(释放内存时同步代码区域遵循的是先进后出);一个是异步代码执行区域,异步代码分为两个队列,宏任务macro-task和微任务micro-task(释放内存时遵循先进先出的原则)。
同步队列的打印从上到下依次打印
遇到Promise、new Promise会立即执行
异步队列中分宏任务和微任务,分到宏任务中的一般有setTimeout、setInterval、setImmediate、messageChannel、,微任务队列的一般有(Promise的)then方法、process.nextTick。
在这里插入图片描述
接下来用一个案例说明:
在这里插入图片描述

从主线程开始走:
1.代码整体当做宏任务开始执行,首先遇到的是setTimeout方法,将其中的回调函数放在宏任务队列中;
2.其次遇到的是new Promise,这时会立即执行console.log(“promise”)。
3.然后遇到then方法,将其放到微任务队列中。
4.再往下走遇到console.log(‘console’),会打印console。
5.整体代码此时已经执行完毕,那么此时微任务中有一个then方法,所以先执行该微任务队列中的方法。
6.执行完毕,发现宏任务队列中有一个setTimeout对应的回调函数,立即执行
7.结束所有的事件轮训。输出结果是:promise、console、then、setTimeout。

宏任务执行完毕—执行微任务—再观察是否有宏任务—依次循环。可以观察到整体代码执行完毕再去执行微任务,微任务执行完毕再去执行宏任务中setTimeout的回调函数。

猜你喜欢

转载自blog.csdn.net/Qian_mos/article/details/85231669