小白自学:js中的预编译

深入解析 JavaScript 预编译机制

在 JavaScript 中,预编译是一个关键且常见的概念,它发生在函数执行之前或在全局作用域中。本文将探讨 JavaScript 预编译机制的发生过程,并分别介绍函数执行前和全局作用域中的预编译过程。

1. 预编译发生在函数执行之前

预编译发生在函数执行之前,主要分为四个步骤:

步骤一:创建 AO 对象(Action Object)

AO 对象是函数执行上下文中的一个重要部分,它用于存储函数内部的变量和函数声明。在预编译阶段,JavaScript 引擎会创建一个 AO 对象。

步骤二:找形参和变量声明

在 AO 对象中,JavaScript 引擎会找到函数的形参和变量声明,并将它们作为 AO 对象的属性名,值为 undefined。

步骤三:统一形参和实参值

JavaScript 引擎会将函数的形参和实参值进行统一,以保证函数执行时能够正确地访问到实参的值。

步骤四:找函数声明

在函数体内,JavaScript 引擎会找到函数声明,并将函数名作为 AO 对象的属性名,值赋予函数体。

预编译发生在函数执行之前的示例

ini 复制代码
function example(x) {
    var y = 2;
    function inner() {
        console.log(z);
    }
    var z = 3;
    inner();
}

example(1);

在这个示例中,函数 example 在被调用之前会经历预编译的过程。

预编译步骤:

  1. 创建 AO 对象:
ini 复制代码
AO = {

};
  1. 找形参和变量声明:
javascript 复制代码
AO = {
    x: undefined
    y: undefined
    z: undefined
}
  1. 统一形参和实参值:
yaml 复制代码
AO = {
    x: 1
    y: undefined
    z: undefined
}
  1. 找函数声明:
javascript 复制代码
AO = {
    x: 1
    y: undefined
    z: undefined
    inner: function(){}
}
  1. 执行阶段
scss 复制代码
function example(x) {
    var y = 2; //将2赋值给有 类似于AO.y = 2
    function inner() {
        console.log(z); //输出为 3
    }
    var z = 3; //将3赋值给z 类似于AO.z = 3
    inner();
}

example(1);

在执行阶段,函数 inner 内部可以访问到变量 z,因为 z 已经被预编译并赋值为 undefined,后面执行代码z = 3的时候就会将3赋给z,这样后面console.log(z)输出的答案就是3

2. 预编译发生在全局作用域中

预编译发生在全局作用域中,主要分为三个步骤:

步骤一:创建 GO 对象(Global Object)

GO 对象是全局作用域中的一个重要部分,它用于存储全局变量和函数声明。在预编译阶段,JavaScript 引擎会创建一个 GO 对象。

步骤二:找变量声明

在全局作用域中,JavaScript 引擎会找到所有的变量声明,并将它们作为 GO 对象的属性名,值为 undefined。

步骤三:找函数声明

在全局作用域中,JavaScript 引擎会找到所有的函数声明,并将函数名作为 GO 对象的属性名,值赋予函数体。

通过以上步骤,JavaScript 引擎在预编译阶段完成了对变量和函数声明的处理,为后续的代码执行提供了基础。理解 JavaScript 预编译机制对于写出高质量、可维护的 JavaScript 代码至关重要。

预编译发生在全局作用域中的示例

javascript 复制代码
var globalVar = "I'm a global variable";

function globalExample() {
    console.log("Hello, global world!");
}

function globalFunction() {
    console.log("I'm a global function!");
}

globalExample();
globalFunction();

在这个示例中,全局作用域中的函数和变量会经历预编译的过程。

预编译步骤:

  1. 创建 GO 对象:
ini 复制代码
GO = {};
  1. 找变量声明:
ini 复制代码
GO = {
    globalVar: undefined,
};
  1. 找函数声明:
javascript 复制代码
GO = {
    globalVar: undefined,
    globalExample: function(){},
    globalFunction: function(){}
};
  1. 执行阶段
scss 复制代码
var globalVar = "I'm a global variable"; 
//将GO.globalVar: undefined 变成  GO.globalVar: "I'm a global variable"

function globalExample() {
    console.log("Hello, global world!");
}

function globalFunction(innerValue) {
    console.log(innerValue);
}

globalExample(); 
globalFunction(globalVar); //输出为 "I'm a global variable"

在执行阶段,全局作用域中的变量和函数都已经被预编译,并且可以被访问和调用。

3. 总结

预编译是 JavaScript 中一个重要的概念,它使我们可以在代码执行之前对变量和函数进行处理。通过了解 JavaScript 中的预编译机制,我们可以更好地理解代码的执行过程,并避免出现意外的错误。希望本文能够帮助您更好地理解 JavaScript 中的预编译机制。

相关推荐
web小白成长日记6 小时前
企业级 Vue3 + Element Plus 主题定制架构:从“能用”到“好用”的进阶之路
前端·架构
APIshop7 小时前
Python 爬虫获取 item_get_web —— 淘宝商品 SKU、详情图、券后价全流程解析
前端·爬虫·python
风送雨7 小时前
FastMCP 2.0 服务端开发教学文档(下)
服务器·前端·网络·人工智能·python·ai
XTTX1107 小时前
Vue3+Cesium教程(36)--动态设置降雨效果
前端·javascript·vue.js
LYFlied8 小时前
WebGPU与浏览器边缘智能:开启去中心化AI新纪元
前端·人工智能·大模型·去中心化·区块链
Setsuna_F_Seiei8 小时前
2025 年度总结:人生重要阶段的一年
前端·程序员·年终总结
model20058 小时前
alibaba linux3 系统盘网站迁移数据盘
java·服务器·前端
han_9 小时前
从一道前端面试题,谈 JS 对象存储特点和运算符执行顺序
前端·javascript·面试
aPurpleBerry9 小时前
React 01 目录结构、tsx 语法
前端·react.js
jayaccc9 小时前
微前端架构实战全解析
前端·架构