js一些底层

简介: js一些底层

简介:

JavaScript 是一种高级编程语言,通常在网页开发中用于前端和后端开发。JavaScript 的底层实现是浏览器或服务器上的 JavaScript 引擎。不同的引擎可能有不同的底层实现,但它们都有一个共同的目标,即执行 JavaScript 代码。

JavaScript 的底层实现涉及到多个方面,包括解释器、编译器、内存管理、执行上下文、作用域链等。以下是 JavaScript 底层的详细解释

解释器和编译器:

解释器:JavaScript 引擎中的解释器负责解析和执行 JavaScript 代码。它逐行读取源代码,将其翻译成机器代码并执行。解释器通常用于快速启动和执行代码。

编译器:某些 JavaScript 引擎包括编译器,用于将 JavaScript 代码转换成优化的中间代码或直接编译成本地机器代码。这样可以提高执行速度。V8 引擎就包括了一个即时编译器(Just-In-Time Compiler,JIT),它将 JavaScript 代码编译成机器代码以提高性能。

执行上下文:

执行上下文是 JavaScript 引擎用来跟踪代码执行的上下文信息。每当函数被调用时,都会创建一个新的执行上下文。执行上下文包含了当前函数的变量、作用域链、this 指向等信息。这些信息在代码执行期间被使用,以确保正确的变量访问和函数调用

作用域链:

作用域链是执行上下文中的一个关键概念。它用于查找变量和函数的定义。当 JavaScript 代码在一个作用域中引用一个变量时,引擎会从当前执行上下文的变量对象开始查找,如果找不到,则会继续向上查找作用域链,直到找到或者达到全局作用域

内存管理:

avaScript 引擎负责管理内存。它使用垃圾回收机制来检测和回收不再使用的对象,以防止内存泄漏。垃圾回收器会定期扫描内存,标记不再引用的对象,并将其释放

APIs(在浏览器环境中):

JavaScript 可以与浏览器提供的各种 API 进行交互,包括 DOM 操作、Ajax 请求、Canvas 绘图等。这些 API 允许 JavaScript 与用户界面和网络进行交互,实现丰富的前端功能。

总而言之,JavaScript 的底层实现是一个复杂的系统,它涉及多个组件和机制,用于解释、执行和优化 JavaScript 代码。不同的 JavaScript 引擎可能在底层实现上有所不同,但它们都遵循了 JavaScript 语言规范,以确保代码在不同环境中的一致性和可移植性。这些底层机制和概念共同使 JavaScript 成为一门功能强大的编程语言。

详解:

解释器和编译器:

解析器(Parser):

解析器是 JavaScript 引擎的一部分,它负责将源代码字符串转化为抽象语法树(AST)。AST 是一个树状结构,表示了代码的语法结构,包括变量声明、函数定义、表达式等。

解析器执行的过程包括词法分析(Lexical Analysis)和语法分析(Syntax Analysis):

词法分析:解析器将源代码字符串分割成词法单元(tokens),例如标识符、运算符、数字、字符串等。这些词法单元是语法分析的基本单位。

语法分析:解析器使用词法单元构建抽象语法树,根据语法规则验证代码的合法性。如果代码不符合语法规则,解析器会抛出语法错误。

编译器(Compiler):

编译器是 JavaScript 引擎的另一部分,它负责将 AST 编译成可执行代码。编译器的工作包括优化和生成目标代码的阶段:

优化:某些 JavaScript 引擎包括一个即时编译器(Just-In-Time Compiler,JIT),它会对 AST 进行优化,尝试将代码转化为更高效的中间代码或直接编译成本地机器代码,以提高执行速度。

生成目标代码:编译器将优化后的代码转化为目标代码,这可以是中间代码,也可以是机器代码(取决于引擎的实现)。目标代码可以由解释器执行或由底层硬件执行。

总结起来,解析器和编译器的工作流程如下:

解析器接收 JavaScript 源代码字符串,并将其分析成词法单元。

解析器使用语法规则将词法单元构建成抽象语法树(AST)。

编译器接收 AST,并可能对其进行优化。

编译器将优化后的代码生成目标代码,可以是中间代码或机器代码。

最终,目标代码由解释器或底层硬件执行,实现 JavaScript 代码的功能。

不同的 JavaScript 引擎可能有不同的解析器和编译器实现,以及不同的优化策略,这些差异可以影响代码的执行性能。一些引擎,如 V8(Chrome 的 JavaScript 引擎),在性能方面非常出色,通过 JIT 编译技术和优化算法来加速 JavaScript 代码的执行。

执行上下文

全局执行上下文(Global Execution Context):

当 JavaScript 代码首次加载时,会创建一个全局执行上下文。这是整个程序的最顶层执行上下文,它负责管理全局范围的变量和函数。全局执行上下文通常只有一个,在整个程序的生命周期中存在。

函数执行上下文(Function Execution Context):

每当函数被调用时,都会创建一个新的函数执行上下文。这个执行上下文与函数相关联,包括了函数的参数、局部变量和内部函数。

每个函数执行上下文都有自己的作用域链,用于查找变量和函数的定义。

函数执行上下文的数量可以随着函数的嵌套调用而增加,每个函数执行上下文都有自己的活动记录(Activation Record)。

作用域链(Scope Chain):

执行上下文中的作用域链是一个包含变量对象的链条,用于查找变量和函数的定义。它从当前执行上下文的变量对象开始,然后逐级向外部执行上下文的变量对象查找,直到找到或达到全局执行上下文。

作用域链的目的是实现词法作用域,即变量的作用域由代码的静态结构决定,而不受运行时条件的影响。

变量对象(Variable Object):

每个执行上下文都有一个与之关联的变量对象,用于存储变量和函数的定义。全局执行上下文的变量对象称为全局对象(Global Object)。

变量对象包括了函数的参数、函数内部声明的变量(包括函数声明)以及在该作用域内可访问的全局变量。

this 指向:

执行上下文还包括了一个 this 指向,它指示了当前代码片段所属的对象。在全局执行上下文中,this 指向全局对象(通常是 window 对象),而在函数执行上下文中,this 的值取决于函数的调用方式。

执行阶段:

执行上下文有两个阶段:创建阶段(Creation Phase)和执行阶段(Execution Phase)。

在创建阶段,变量对象被设置,函数声明被提升,作用域链被创建。

在执行阶段,JavaScript 代码逐行执行,变量分配、函数调用等操作都发生在这个阶段。

销毁执行上下文:

当函数执行结束时,或者全局代码执行完成时,相应的执行上下文会被销毁,释放相关的内存和资源。

了解执行上下文的工作原理是理解 JavaScript 作用域、变量生命周期和函数调用的关键。不同的执行上下文之间相互嵌套,并且通过作用域链形成了变量的访问路径,这是 JavaScript 语言的一个核心特性。

目录
相关文章
|
4月前
|
缓存 JavaScript 前端开发
[译] Vue.js 内部原理浅析
[译] Vue.js 内部原理浅析
|
6月前
|
SQL 开发框架 缓存
js代码就应该这样写才高效
js代码就应该这样写才高效
33 2
|
7月前
|
存储 JavaScript 前端开发
js的一些底层
js的一些底层
35 1
|
7月前
|
存储 JavaScript
JS中相等(==)和等全(===)的区别与练习
JS中相等(==)和等全(===)的区别与练习
43 1
|
JavaScript
js中=,==,===和 != 和 !==的区别和使用
js中=,==,===和 != 和 !==的区别和使用
68 1
|
7月前
|
JavaScript
JS中for-in和for-of的区别
JS中for-in和for-of的区别
|
XML 移动开发 JavaScript
|
存储 移动开发 JavaScript
JS三种常见的存储机制
JS三种常见的存储机制
159 1
|
JavaScript 前端开发 C#
js代码如何封装
js代码如何封装
102 0
|
JavaScript
Js原生有坑系列
Js原生有坑系列
96 0