JavaScript
引擎是一个计算机程序,它的主要作用是JavaScript运行时将源码编译为机器码。
每个主流Web浏览器都有自己的JavaScript
引擎,它通常由web
浏览器供应商开发。
Google Chrome V8。
Mozilla Firefox Spider Monkey。
Safari Javascript Core Webkit。
Edge (Internet Explorer)
以前的JavaScript
引擎主要在web浏览器使用,不过随着nodejs
的出现就打破了这种局限。
V8包含了解析器(parser
),解释器(Ignition
),优化编译器(TurboFan
)。
解析器(parser):用于生成抽象语法树。
解释器(Ignition):将源码转换为字节码。
优化编译器(TurboFan
):进行一些优化编译优化处理,比如内联缓存。
下面是V8引擎的大体工作流程。
浏览器运行环境中,浏览器提供了Web API
,如:HTTP请求,计时器,事件等。
服务器运行环境中,nodejs提供了API。
下面是JavaScript
在浏览器中运行时的架构,它包含一个内存堆、一个内存栈、一个事件循环、一个回调队列。
1 2 3 4 5 |
stack
heap
call stack
callback queue
event loop
|
下面代码展示了JavaScript
执行的调用栈变化。
1 2 3 4 5 6 7 8 9 |
function add(x, y) {
return x + y;
}
function print(x, y) {
console.log( 'x+y=' ,add(x, y))
}
print(1, 3)
|
JavaScript
先执行了 print
函数,然后调用Web API setTimeout()
,Web API
存储了 setTimeout()
的回调函数,3秒后将回调函数添加到回调队列,事件循环发现调用栈为空,于是将队列里的回调函数移至调用栈执行。
1 2 3 4 5 6 7 8 9 10 11 |
function add(x, y) {
return x + y;
}
function print(x, y) {
setTimeout( function (){
console.log( 'x+y=' ,add(x, y))
}, 3000)
}
print(1, 3)
|
JavaScript
运行主要依靠JavaScript
引擎和运行环境, 引擎 将js源码翻译成计算机所理解的机器码, 运行环境 提供了一些与计算机底层通讯的API和运行实现。