侧边栏壁纸
博主头像
Fonda's Lab 博主等级

关山难越,谁悲失路之人?萍水相逢,尽是他乡之客。

  • 累计撰写 49 篇文章
  • 累计创建 27 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

JavaScript代码执行过程详解

LouisFonda
2024-05-27 / 0 评论 / 0 点赞 / 8 阅读 / 0 字 / 正在检测是否收录...

JavaScript代码执行过程详解

当我们在浏览器或者Node.js等JavaScript运行环境中执行JavaScript代码时,实际上是经历了一系列的步骤和过程。下面我将详细介绍JavaScript代码执行的过程,希望能够帮助你更深入地理解JavaScript的执行机制。

1. 词法分析和语法分析

JavaScript引擎首先会对代码进行词法分析和语法分析。词法分析将代码分解为一个个Token(词法单元),语法分析则将Token组装成语法树。

2. 创建执行上下文(Execution Context)

在执行JavaScript代码之前,JavaScript引擎会创建全局执行上下文(Global Execution Context)。在函数被调用时,还会创建函数执行上下文(Function Execution Context)。

3. 变量对象(Variable Object)的创建

在创建执行上下文的过程中,JavaScript引擎会创建变量对象(VO)。变量对象用于存储在当前上下文中声明的变量、函数声明以及函数的参数。全局上下文中的变量对象被称为全局对象(Global Object),函数上下文中的变量对象被称为活动对象(Activation Object)。

4. 作用域链(Scope Chain)的创建

在JavaScript中,每个执行上下文都有一个与之关联的作用域链。作用域链是由当前执行上下文的变量对象和其上级执行上下文的变量对象所组成的链式结构。作用域链的创建过程就是将当前执行上下文的变量对象与其上级执行上下文的变量对象进行连接。

5. 变量提升(Hoisting)

在执行JavaScript代码之前,JavaScript引擎会对变量声明和函数声明进行提升。变量提升会将变量声明和函数声明提升到当前执行上下文的顶部,使得在代码执行过程中可以在变量声明和函数声明之前访问到这些变量和函数。

6. 代码执行

一旦创建了执行上下文、变量对象和作用域链,并且进行了变量提升,JavaScript引擎就开始执行代码。在执行代码的过程中,JavaScript引擎会按照作用域链的顺序查找变量的值,并且根据执行上下文中的变量对象来存储和管理变量的值。

7. 闭包的创建

在JavaScript中,闭包是指可以访问其外部作用域中变量的函数。闭包的创建依赖于作用域链的机制,当内部函数引用外部函数中的变量时,就会创建一个闭包。闭包可以使得外部函数中的变量在函数执行完毕后仍然可以被内部函数所访问。

通过以上步骤,我们可以看到JavaScript代码是如何在运行时被解析、创建执行上下文、创建变量对象、创建作用域链、进行变量提升以及执行代码的。这些步骤和过程构成了JavaScript代码执行的基本流程,深入理解这些流程可以帮助我们更好地理解JavaScript的执行机制和语言特性。

代码解释

var globalVar = "I am global";

function outerFunction(outerParam) {
  var outerVar = "I am outer";

  function innerFunction(innerParam) {
    var innerVar = "I am inner";
    console.log(globalVar);    // Step 6: 在全局执行上下文中查找并打印 globalVar
    console.log(outerParam);   // Step 6: 在 outerFunction 执行上下文中查找并打印 outerParam
    console.log(outerVar);     // Step 6: 在 outerFunction 执行上下文中查找并打印 outerVar
    console.log(innerParam);   // Step 6: 在 innerFunction 执行上下文中查找并打印 innerParam
    console.log(innerVar);     // Step 6: 直接在当前 innerFunction 执行上下文中查找并打印 innerVar
  }

  innerFunction("I am inner param");  // Step 5: 调用 innerFunction,创建 innerFunction 执行上下文
}

outerFunction("I am outer param");   // Step 4: 调用 outerFunction,创建 outerFunction 执行上下文

接下来,我们来按照步骤解释代码的执行过程:

  1. 词法分析和语法分析:首先对代码进行词法分析和语法分析,将其转换为语法树。
  2. 创建执行上下文(Execution Context):创建全局执行上下文,并初始化全局变量对象(VO)。
  3. 变量对象(Variable Object)的创建:全局执行上下文中的变量对象包含了全局变量 globalVar。
  4. 作用域链(Scope Chain)的创建:全局执行上下文的作用域链包含了全局变量对象。
  5. 变量提升(Hoisting):全局变量 globalVar 被提升到全局变量对象的顶部。
  6. 代码执行:
    • 调用 outerFunction,创建 outerFunction 的执行上下文:
    • 创建 outerFunction 的变量对象,包含了参数 outerParam 和变量 outerVar。
    • 在 outerFunction 执行上下文中,查找并打印 outerParam 和 outerVar。
    • 调用 innerFunction,创建 innerFunction 的执行上下文:
    • 创建 innerFunction 的变量对象,包含了参数 innerParam 和变量 innerVar。
    • 在 innerFunction 执行上下文中,查找并打印 innerParam 和 innerVar。
    • 在内部函数 innerFunction 中,直接访问全局变量 globalVar。
    • 最终按照作用域链的顺序,依次查找并打印变量的值。
    • 闭包的创建:在 innerFunction 中引用了外部函数 outerFunction 中的变量,因此会创建闭包。

总结

在 JavaScript 中,代码的执行过程可以分为词法分析和语法分析、创建执行上下文、创建变量对象、创建作用域链、变量提升、代码执行和闭包的创建等步骤。

  • 词法分析和语法分析:将代码转换为语法树。
  • 创建执行上下文:在执行代码之前创建全局执行上下文,并在函数被调用时创建函数执行上下文。
  • 变量对象的创建:包含在当前上下文中声明的变量、函数声明和参数。
  • 作用域链的创建:由当前执行上下文的变量对象和其上级执行上下文的变量对象组成的链式结构。
  • 变量提升:将变量声明和函数声明提升到当前执行上下文的顶部。
  • 代码执行:按照作用域链的顺序查找变量的值,并执行代码。
  • 闭包的创建:在内部函数引用外部函数中的变量时会创建闭包,使得外部变量在函数执行完毕后仍然可以被内部函数所访问。
    深入理解这些执行过程可以帮助我们更好地理解 JavaScript 的执行机制和语言特性,从而写出更加高效、可维护的 JavaScript 代码。
0

评论区