JavaScript 完全指南

从核心到实践 - 掌握现代 JavaScript 开发

JavaScript 如何运行代码

理解JavaScript引擎的执行过程、执行上下文和调用栈

🚀 **JavaScript 是如何工作的?**

当你写下一行JavaScript代码并运行它时,幕后发生了什么?

🎭 **三个核心概念:**

**1. JavaScript 引擎**
• V8 (Chrome, Node.js)
• SpiderMonkey (Firefox)
• JavaScriptCore (Safari)

就像汽车的发动机,JavaScript引擎负责"解释"和"执行"你的代码。

**2. 执行上下文 (Execution Context)**

想象一个"舞台",每次函数被调用时,都会搭建一个新舞台:

```javascript
// 全局执行上下文(主舞台)
let name = "Alice"

function greet() {
  // 函数执行上下文(临时舞台)
  let greeting = "Hello " + name
  console.log(greeting)
}

greet() // 搭建临时舞台 → 表演 → 拆除舞台
```

每个执行上下文包含:
• **变量环境** - 存储变量和函数
• **作用域链** - 查找变量的路线
• **this 值** - 当前上下文的主角

**3. 调用栈 (Call Stack)**

就像一摞盘子(后进先出):

```javascript
function first() {
  console.log("第一个")
  second()
  console.log("第一个结束")
}

function second() {
  console.log("第二个")
  third()
  console.log("第二个结束")
}

function third() {
  console.log("第三个")
}

first()
```

**调用栈的变化:**
1. [first] - first 入栈
2. [first, second] - second 入栈
3. [first, second, third] - third 入栈
4. [first, second] - third 执行完出栈
5. [first] - second 执行完出栈
6. [] - first 执行完出栈

🔍 **作用域链 (Scope Chain)**

变量查找就像找东西:先看房间,再看楼层,最后看整栋楼

```javascript
let building = "整栋楼的变量"

function floor() {
  let floorVar = "楼层变量"

  function room() {
    let roomVar = "房间变量"
    console.log(roomVar)     // ✓ 房间里找到
    console.log(floorVar)    // ✓ 去楼层找到
    console.log(building)    // ✓ 去整栋楼找到
  }

  room()
}
```

💾 **内存管理**

• **栈内存** - 存储基本类型(数字、字符串等),像抽屉
• **堆内存** - 存储对象和数组,像仓库
• **垃圾回收** - 自动清理不用的内存,像定期打扫

```javascript
let number = 42          // 存在栈内存(抽屉)
let object = { x: 1 }    // 对象存在堆内存(仓库)
                         // object 变量存栈内存,保存仓库地址
```

🎯 **关键要点:**
1. JavaScript 是**解释执行**的语言
2. 每次调用函数都会创建新的**执行上下文**
3. **调用栈**管理函数执行顺序(后进先出)
4. **作用域链**决定变量查找路径(从内到外)
5. 内存分为**栈**(基本类型)和**堆**(对象)

这就是 JavaScript 代码执行的底层机制!

💻 代码练习区

在浏览器的开发者控制台(F12)中尝试这一章节的代码示例!

提示:按 F12 打开控制台,在 Console 标签页中输入代码进行练习

🎯 实践:理解调用栈

在控制台中运行以下代码,观察执行顺序:

function first() {
  console.log("1. 进入 first")
  second()
  console.log("4. first 结束")
}

function second() {
  console.log("2. 进入 second")
  third()
  console.log("3. second 结束")
}

function third() {
  console.log("2.5 执行 third")
}

first()

📊 学习进度

已完成章节:0 / 11