简介要理解JavaScript的运行原理,我们需要了解以下两个方面。JavaScript引擎。JavaScript运行时环境。JavaScript引擎什么是JavaScript引擎?JavaScript引擎是一种计算机程序,其主要功能是在JavaScript运行时将源代码编译成机器码。每个主要的网络浏览器都有自己的JavaScript引擎,通常由网络浏览器供应商开发。谷歌浏览器V8。MozillaFirefox蜘蛛猴。SafariJavascript核心Webkit。Edge(InternetExplorer)之前的JavaScript引擎主要用于网页浏览器,但是随着nodejs的出现,这个限制被打破了。V8引擎V8包括解析器(parser)、解释器(Ignition)和优化编译器(TurboFan)。解析器(parser):用来生成抽象语法树。解释器(Ignition):将源代码转换为字节码。OptimizingCompiler(TurboFan):进行一些优化编译和优化处理,比如内联缓存。下面是V8引擎的大致工作流程。首先,解析器生成一个抽象语法树。然后解释器根据语法树生成V8格式的字节码。然后优化编译器将字节码编译成机器码。RuntimeEnvironment在浏览器运行环境中,浏览器提供了WebAPI,例如:HTTP请求、定时器、事件等。在服务器运行环境中,nodejs提供了API。下面是JavaScript在浏览器中运行的架构,包括内存堆、内存栈、事件循环、回调队列。内存栈(stack),一块连续的内存区域,为每个执行的函数分配一个本地上下文。内存堆(heap),一块更大的内存区域,存放着所有动态分配的内容。调用栈,一种记录我们在程序中位置的数据结构。回调队列(callbackqueue),存放异步任务的回调函数。事件循环(eventloop)不断地检查调用栈是否为空,如果为空则将回调队列头部的回调函数移到调用栈中执行。运行时的调用栈下面的代码展示了JavaScript执行时调用栈的变化。functionadd(x,y){returnx+y;}functionprint(x,y){console.log('x+y=',add(x,y))}print(1,3)异步任务JavaScript首先执行打印函数,然后调用WebAPIsetTimeout()。WebAPI存储了setTimeout()的回调函数。3秒后,回调函数被添加到回调队列中。事件循环发现调用栈为空,于是将队列中的回调函数移动到调用栈中执行。functionadd(x,y){returnx+y;}functionprint(x,y){setTimeout(function(){console.log('x+y=',add(x,y))},3000)}print(1,3)总结JavaScript的运行主要依赖于JavaScript引擎和运行环境。引擎将js源码翻译成电脑能看懂的机器码。运行环境提供了一些与计算机底层通信的API和运行实现。
