JavaScript引擎简介

JavaScript引擎是一个专门处理JavaScript脚本语言的进程虚拟机,通常都是附带在网页浏览器之中。

主流浏览器 js引擎
IE JScript(IE3.0-IE8.0) / Chakra (IE9~)
Chrome V8
Safari Nitro(4-)
Firefox SpiderMonkey(1.0-3.0)/ TraceMonkey(3.5-3.6)/ JaegerMonkey(4.0-)
Opera Linear A(4.0-6.1)/ Linear B(7.0-9.2)/ Futhark(9.5-10.2)/ Carakan(10.5-)

虚拟机(Virtual Machine)指通过软件模拟具有计算机系统功能、运行在一个独立环境中的计算机系统或进程。

根据虚拟机的功能和运用可以分为系统虚拟机和进程虚拟机两类。

系统虚拟机:模拟计算机能够完整运行操作系统的平台。

进程虚拟机:模拟计算机进程,能够运行单个计算机程序。

也就是说计算机在 var a = 1 + 1 JavaScript代码运行后能够输出2,正是因为JavaScript引擎,能够在进程中运行这段JavaScript代码,并在运行时将其编译成能够被计算机运行的代码,然后在交给CPU计算,最后讲计算的结果输出。可以理解为整个运行过程都在为大家解释为什么 var a = 1 + 1最后等于2。

以V8为例,从功能模块来看,JavaScript引擎主要由解释器、编译器组成。

解释器:将JavaScript源码解释成抽象语法树(AST)和相应的作用域,依据AST和作用域生成字节码(中间代码)。

编译器:将字节码编译成可被计算机直接运行的机器码。

在这里插入图片描述

以V8为例,从执行逻辑上来看,JavaScript引擎主要由内存堆、调用栈、web API、回调队列、事件轮询五部分组成。

内存堆:分配内存的地方,当JavaScript引擎遇到变量声明和函数声明是就会把他们存储在堆里面,初始值为undefined,遇到赋值时在分配具体值(变量提升)。

调用栈:代码运行的地方,当JavaScript引擎遇到可执行单元即函数调用,则会将其推入调用栈中进行运行。

web API:接收引擎之外api的地方,当JavaScript引擎遇到数据请求( HTTP/AJAX )、DOM操作、定时器( setTimeout等 )时,JavaScript引擎就会知道有相应的代码在等待处理(异步处理)。

回调队列:代码排队的地方,当Web API 的事件达到触发条件,JavaScript引擎就会将相应的代码推入到回调队列中排队等候,由于回调队列设置有相应的处理权重,即在队列中promise函数总会先于定时器函数进行处理(微任务、宏任务)。

事件轮询:监听通知代码执行的地方,JavaScript引擎会持续监听调用栈和回调队列,一旦检测到调用栈为空,就会通知回调队列把当前排在第一个的回调函数推入调用栈中运行。

因为JavaScript引擎在运行JavaScript代码时调用栈是唯一的,所有的JavaScript代码都是在这个调用栈里按照顺序执行,不能同时执行多个函数,因此JavaScript是单线程的。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/My_Soul_/article/details/127307834
今日推荐