JavaScript新手必看系列之预编译

前言

预编译是JavaScript的核心概念,也是新手向中级进阶的必经之路。理解它,意味着你能:

  • 彻底搞懂变量提升
  • 理解函数声明的"特权"
  • 避免常见的作用域陷阱

本文用最简单的语言和示例,带你快速掌握全局预编译与函数预编译的完整过程。

What's that?

简单说,JS在执行代码前会进行"准备工作" ------ 预编译。在这个阶段JS的V8引擎会进行变量声明,函数声明的提升

预编译的两种场景

1. 全局作用域下的预编译

分三步:

1.创建 GO(Global Object)

  • 在浏览器中就是 window 对象

  • 在 Node.js 中就是 global 对象

2.找到变量声明,作为作为GO属性名,值为undefined

  1. 找到函数声明,作为GO属性名,值为函数体

举个简单的例子:

js 复制代码
console.log(a) // undefined
var a = 1
console.log(a) // 1

发什么了什么?

  1. 创建 GO ={}
  2. 找到变量声明 var a ,GO = { a : undefined }
  3. 找函数声明,没有函数声明就不找

执行过程如下:

js 复制代码
//预编译后就相当于:
var a = undefined
console.log(a) //输出 undefined
  a = 1
console.log(a) //输出 1

2.函数作用域下的预编译

函数较为复杂,四步:

  1. 创建AO(Activation Object)

  2. 找形参和变量声明,作为AO属性名,值为 undefined

  3. 将实参赋给形参

  4. 找函数声明,作为AO 属性名,值为函数体

举例:

js 复制代码
function fn(a) {
  console.log(a);
  var a = 123
  console.log(a);
  function a() {}
  var b = function() {}
  console.log(b);
  function c() {}
  var c = a
  console.log(c);
}
fn(1)

干了什么?

  1. 创建AO = {

2.找形参和变量声明,作为AO属性名,值为 undefined

AO = { a : undefined

b : undefined

c : undefined }

3.将实参赋给形参

AO = { a : 1 b : undefined

c : undefined }

4.找函数声明,作为AO 属性名,值为函数体

AO = { a : function a() {}

b : undefined

c : function c() {} }

函数体内执行过程:

js 复制代码
// 预编译后的状态:
var c
var b
var a
console.log(a); // function a() {}
 a = 123
console.log(a); // 123
b = function() {}
console.log(b);  //function b() {}
c = a
console.log(c); //123

掌握了预编译,你就真正理解了 JavaScript 的执行机制,这对后续学习闭包、作用域链等概念至关重要!

希望这篇文章能帮助你彻底理解 JavaScript 预编译,如果有任何疑问,欢迎在评论区讨论!

相关推荐
打小就很皮...10 分钟前
Tesseract.js OCR 中文识别
前端·react.js·ocr
qq_1777673720 分钟前
React Native鸿蒙跨平台实现应用介绍页,实现了应用信息卡片展示、特色功能网格布局、权限/联系信息陈列、评分展示、模态框详情交互等通用场景
javascript·react native·react.js·ecmascript·交互·harmonyos
2603_9494621025 分钟前
Flutter for OpenHarmony社团管理App实战:预算管理实现
android·javascript·flutter
wuhen_n32 分钟前
JavaScript内存管理与执行上下文
前端·javascript
Hi_kenyon1 小时前
理解vue中的ref
前端·javascript·vue.js
jin1233222 小时前
基于React Native鸿蒙跨平台地址管理是许多电商、外卖、物流等应用的重要功能模块,实现了地址的添加、编辑、删除和设置默认等功能
javascript·react native·react.js·ecmascript·harmonyos
2501_920931702 小时前
React Native鸿蒙跨平台医疗健康类的血压记录,包括收缩压、舒张压、心率、日期、时间、备注和状态
javascript·react native·react.js·ecmascript·harmonyos
落霞的思绪2 小时前
配置React和React-dom为CDN引入
前端·react.js·前端框架
Hacker_Z&Q2 小时前
CSS 笔记2 (属性)
前端·css·笔记
Anastasiozzzz2 小时前
LeetCode Hot100 295. 数据流的中位数 MedianFinder
java·服务器·前端