JavaScript中的预编译如何进行?看完这篇就够了
前言
预编译,预编译何顾名思义就是进行是做些代码文本的替换工作。是看完整个编译过程的最先做的工作。JavaScript 的篇够圣经 —— MDN 明确地说过, JavaScript 是预编译何一个解释型语言,而并非编译型语言,进行所以预编译对于JS来说是看完子虚乌有的。但是篇够人们喜欢称之为预编译其实也无伤大雅,关键在于为什么人们会认为JS存在预编译,预编译何是进行JS的哪种行为让人们觉得它产生了预编译呢?让我们来简单聊一聊。

引入
在代码执行前,看完编译器会进行如下操作:
一 parse阶段
分词。篇够就是预编译何将代码分成原子符号(token)
将token解析翻译成AST(语法生成树)。
二 analyze阶段
遇到声明语句,进行将会把声明传到作用域(scope)中创建绑定,看完分配内存并将变量默认设为undefined或函数体。
然后就可以执行代码啦,执行中途每次遇到赋值或者取值,源码库都会从作用域中查找绑定。这样看,是不是有点“预编译”内味了?但是实际上还是称它为预处理更加贴切一点。接下来,让我们来了解一波看起来最像预编译的操作--第三步的干货。
“预编译”
我的老师在和我讲相关知识点前和我说过这么一个笑话:
面试时我因为这么一个问题挂了
var a = 100 function foo(){ console.log(a) } foo()问:为什么输出a的值是100?
答:因为100赋值给了a。
老师说完我头昏脑涨,完全不明白笑点在哪,后来才知道这是在考察“预编译”这方面的知识。
总的来说,“预编译”可以分为
创建GO对象(global object) 发生在页面加载完成时
创建AO对象(activation object) 发生在函数执行前一刻
具体步骤如下:
全局预编译
1. 创建GO对象
2. 找变量声明,将变量声明作为GO对象的属性名,并赋值undefined
3. 找全局里的函数声明,将函数名作为GO对象的属性名,值赋予函数体
局部预编译
1. 创建一个AO对象
2. 找形参和变量声明,将形参和变量声明作为AO对象的企商汇属性名,值为undefined
3. 将实参和形参统一
4. 在函数体里找函数声明,将函数名作为AO对象的属性名,值赋予函数体
所以那个笑话里的面试问题我们应该这么回答:
首先,编译器创建一个GO对象
找到变量声明 var a
和函数声明 function foo(){}
将上面两个变量声明作为GO的属性名赋初值
GO{
a:undefined
foo:function(){}
}
然后运行第一行代码 a=100
在GO中将100赋值给a
再执行第五行代码运行foo函数
创建一个AO对象
在函数体内找变量声明和形参,(无)
再在函数体内找函数声明(无)
所以
AO{
}
完成后运行第三行代码,输出a
先在AO对象中寻找a的值,发现不存在,向外部作用域扩展,在GO对象中寻找a,发现a的值为100
输出100
当然,笑话里的题过于简单,但是能让我们清晰的了解到这个“预编译”的进行
下面,我们来看一道面试题简化版,练练手:
global = 100 function fn() { console.log(global); global = 200 console.log(global); var global = 300 } fn()它的逻辑和输出结果是多少呢?通过一步步的分析我们可以知道具体的分析应该是这样的:
GO: { global: undefined => 100, fn: function() {} } global = 100 // 没有声明的变量默认为全局变量,b2b信息网也会放到GO中 function fn() { console.log(global); // 输出undefined global = 200 console.log(global); // 输出200 var global = 300 } AO: { global: undefined => 200 => 300 } fn()相关文章
Win764位安装教程(轻松学会Win764位系统的安装与设置)
摘要:随着技术的不断发展,Win764位系统已经成为许多计算机用户的首选操作系统。然而,对于一些没有安装经验的用户来说,可能会感到困惑和无措。本文将提供一份详细的Win764位安装教程,...2025-11-05
RedMonk 语言排行:Python 力压 Java,Ruby 持续下滑,前二十变动颇大
知名软件行业分析公司 RedMonk 发布了 2021 年 1 月(第一季度)编程语言排行榜。RedMonk 编程语言排行榜通过追踪编程语言在 GitHub 和 Stack Overflow 上的代码2025-11-05
随着 Facebook 的 DETR ECCV 2020)[2] 和谷歌的 ViT ICLR 2021)[3] 的提出,Transformer 在视觉领域的应用开始迅速升温,成为当下视觉研究的第一热点2025-11-05
在互联网2.0时代,工程师解决业务问题主要依赖的是自己掌握的各种工具和软件伴随着席卷全球的开源浪潮,开源工具和软件也迅猛增长。工程师需要关注的技术和软件也随之越来越多,学习负担越来越大,大脑也越来越不2025-11-05电脑报read错误的解决方法(遇到电脑报read错误如何应对,尝试这些方法解决问题)
摘要:现代社会,电脑已经成为人们生活中不可或缺的工具之一。然而,有时我们可能会遇到电脑报read错误的情况,这给我们的使用体验带来了很大的困扰。本文将为大家介绍一些解决电脑报read错误...2025-11-05
一、什么是Vue.js?Vue 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目2025-11-05

最新评论