JS之预编译

本文主要介绍了JavaScript的预编译过程,包括预编译的作用、函数声明与变量赋值的区别,以及预编译在函数执行前和脚本执行前的不同阶段所做的工作。通过实例解析,帮助读者理解预编译中变量和函数的声明与初始化行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天有幸获得腾讯的电话面试,不幸的是面试非常惨,但是从中认识到自己的不足和找到日后该努力的方向,就拿面试中的关于js的预编译来说吧,小编都不知道是啥,面试完后赶紧查资料,写总结。

首先javascript是解释型语言,自然就是编译一行,执行一行。js运行过程分为三步:1、语法分析 2、预编译  3、解释执行

语法分析就是指js引擎去判断检查你的代码是否存在语法错误,解释执行更不用多说,自然就是执行你的代码,然而重中之重的是预编译,预编译简单理解就是在内存中开辟一些空间,存放一些变量与函数 ,那么到底预编译是在什么时候开始发生的呢?接下来就是本章的重点所在了。

理解预编译首先要明白函数声明和变量赋值:

function a(){ }//函数声明  

### JavaScript 全局预编译机制解析 在 JavaScript 中,全局预编译机制是其执行模型的一部分。当代码进入执行阶段之前,JavaScript 引擎会先进行一个预编译的过程,这个过程包括变量声明和函数声明的解析。以下是关于全局预编译机制的具体实现方式: #### 1. 预编译阶段 在代码执行前,JavaScript 引擎会先对全局作用域中的代码进行预编译。这一阶段主要包括以下内容: - **变量声明**:所有使用 `var` 声明的变量会被初始化为 `undefined` 并添加到全局对象(如浏览器中的 `window` 或 Node.js 中的 `global`)中[^4]。 - **函数声明**:函数声明会被提升到当前作用域的顶部,并且整个函数体也会被加载到内存中[^4]。 例如,在以下代码中: ```javascript console.log(a); // 输出 undefined var a = 10; ``` 在预编译阶段,变量 `a` 被初始化为 `undefined`,因此在实际赋值之前访问它时,输出的是 `undefined`[^3]。 #### 2. 执行上下文与全局对象 在全局作用域下,JavaScript 会创建一个全局执行上下文(Global Execution Context)。全局执行上下文中包含一个全局对象(如 `window`),以及一个变量环境(Variable Environment)用于存储所有全局变量和函数声明[^1]。 #### 3. 变量提升与函数提升 - **变量提升**:使用 `var` 声明的变量会在预编译阶段被提升到作用域顶部并初始化为 `undefined`。如果在声明之前访问该变量,则会返回 `undefined`[^4]。 - **函数提升**:函数声明会被完全提升到作用域顶部,这意味着可以在声明之前调用函数。然而,函数表达式不会被提升[^4]。 示例代码如下: ```javascript foo(); // 输出 'bar' function foo() { console.log('bar'); } baz(); // 抛出 TypeError: baz is not a function var baz = function() { console.log('qux'); }; ``` #### 4. 全局对象的作用 全局对象(如 `window` 或 `global`)充当了全局作用域的容器。所有未明确指定作用域的变量和函数都会被绑定到全局对象上[^2]。这也解释了为什么在函数内部可以访问全局变量——因为它们都存储在全局对象中。 #### 5. 赋值覆盖与同名冲突 在全局作用域中,如果存在同名的变量和函数声明,函数声明会覆盖变量声明。此外,形参与局部变量同名时,形参优先级更高[^4]。 示例代码如下: ```javascript function test() { console.log('original function'); } var test = 'variable'; test(); // 抛出 TypeError: test is not a function ``` 在上述代码中,变量声明覆盖了函数声明,导致 `test` 成为一个字符串而不是函数[^3]。 ### 示例代码 以下是一个完整的例子,展示全局预编译机制的工作方式: ```javascript // 函数声明被提升 foo(); // 输出 'bar' // 变量声明被提升,但赋值发生在执行阶段 console.log(a); // 输出 undefined var a = 10; function foo() { console.log('bar'); } ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值