初学JavaScript----JavaScript引擎与作用域解析

2 阅读2分钟

了解JavaScript引擎

JavaScript 引擎是能够解析和执行 JavaScript 代码的程序或虚拟机,它是 JavaScript 运行的核心,常见于浏览器、服务器等环境,负责将开发者编写的 JS 代码转化为计算机可执行的机器指令,同时还会通过各种优化手段提升代码运行效率。

JavaScript提供运行环境:实现 JavaScript 标准中的核心 API(如 Array、Object 等内置对象和方法),同时对接宿主环境(浏览器、Node.js 等)的 API,让 JS 代码能与外部交互。

主流JavaScrip引擎

V8 引擎:由 Google 开发,是目前影响力最大的 JS 引擎。是一段庞大的函数,可以读懂并执行JS代码。

SpiderMonkey:Mozilla 开发的 JS 引擎,是最早的 JavaScript 引擎之一,用于 Firefox 浏览器。

JavaScriptCore:苹果开发的引擎,用于 Safari 浏览器,同时也是 iOS 和 macOS 平台上默认的 JS 执行引擎。

Chakra:微软为 Edge 浏览器开发的引擎(早期 Edge 使用,后期 Edge 改用 Chromium 内核,转而使用 V8)。

笔者这里主要以V8引擎为例。

JS的执行

在代码执行前,JS 引擎需要完成代码加载预处理,为执行阶段做准备。

1.代码被v8 读取到的第一时间,并不是执行,而是会先编译(梳理)

  • 梳理: 1.分词/词法分析

2.解析/语法分析 -- AST(抽象语法树)获取有效标识符

3.生成代码

函数

形如 function foo() {} ,就是一个函数体,函数存在的意义就是让我们可以将某一段逻辑代码,写在函数中,最后调用函数,这段代码才会执行

作用域

在 JavaScript 中,作用域(Scope)  指的是变量、函数和对象的可访问范围,它决定了代码中哪些部分可以访问特定的变量或函数。作用域的核心作用是隔离变量,避免命名冲突,同时控制内存的生命周期。

1.全局作用域 (在所有函数和代码块之外声明的变量 / 函数,属于全局作用域。 )

2.函数作用域 (参数也是该作用域的一个有效标识)

3.块级作用域 (let const 可以形成块级作用域)和 {} 语法配合使用会导致声明的变量会形成作用域

通常,条件语句或循环语句不能形成作用域

而与let 或const 搭配使用会形成作用域

外层作用域是不能访问内层作用域的变量的,而内层作用域可以访问外层作用域的变量

let

当一个{} 语句中存在 let x 时,在该{} 中访问x,永远都只能访问到该{} 中声明的 x,就算内部访问不到,也不能访问外部 的x。这种规则称为 --- 暂时性死区