面试官喜欢问的预编译,你了解吗?

预编译

预编译是指在程序运行之前,先对程序进行一些处理,例如预处理、编译、链接等,以便提高程序运行效率和减少运行时的错误。

预编译的目的主要有以下几点:

  • 预处理:在预编译阶段,程序中的预处理指令会被执行,例如宏定义、条件编译等。预处理能够提高代码的可读性和可维护性,也有利于代码的重用和移植性。
  • 编译:在编译阶段,源代码会被编译器翻译成机器代码。编译的过程中会检查语法错误,优化代码结构,生成目标文件等。通过预编译,可以提前发现和修复代码中的错误,减少运行时出错的可能性。
  • 链接:在链接阶段,将编译生成的目标文件链接在一起,生成可执行文件。预编译可以帮助程序更好地管理各个文件之间的依赖关系,减少不必要的重复工作,提高程序执行效率。

编译的作用 :提高程序的效率和稳定性 ,减少程序在运行过程中可能出现的错误,并提高程序的可维护性可扩展性

作用域

作用域是函数身上的属性 \[scope] (给js引擎访问的,我们拿不到 -- 隐式属性 ),用于存储函数中的有效标识符

作用域链

作用域是执行期上下文对象的集合,这种集合呈链式连接,我们把这种链关系称之为作用域链。

  • GO (Global Object):函数执行上下文对象;
  • AO (Activation Object):全局执行上下文对象;(可访问GO)

代码

ini 复制代码
function a() {
   function b(){
    var b = 22; 
    console.log(a);
   };
   var a = 111;
   b();
  
};

var glob = 100;
a();

作用域链

分析

全局定义了函数a和global,形成如图GO,此时a\[scope]的0指向GO,函数a内定义了函数b和a,形成如图AO,此时a\[scope]的0指向自己的AO,1指向GO,函数b定义了b,形成如图AO,b\[scope]的0指向自己的AO,1指向a\[scope]。

声明提升

  • 变量声明,声明提升(上一篇文章提到过)
  • 函数声明,整体提升
ini 复制代码
test();
function test() {
    var a = 123;
    console.log(a);
}

上述代码相当于:

scss 复制代码
// 函数声明提升
function test() {
    var a = 123;
    console.log(a);
}
test();

预编译的分析(重点!)

定义

  • 发生在全局:
  1. 创建GO对象
  2. 找变量声明,将变量名作为GO的属性名,值为undefined
  3. 在全局找函数声明,将函数名作为GO的属性名,值为该函数体
  • 发生在函数体内:
  1. 创建一个AO对象
  2. 找形参和变量声明,将形参和变量名作为AO的属性名,值为undefined
  3. 形参和实参统一
  4. 在函数体内找函数声明,将函数名作为AO的属性名,值为该函数体

步骤

全局预编译-->GO-->执行,碰见函数-->函数预编译-->AO-->执行函数

实例一

代码

ini 复制代码
var a = 1;
function fn(a) {
    var a = 2;
    function a() {};
    console.log(a);
}

fn(3);

分析

  • 首先进行全局预编译-->GO
  1. GO:{ }
  2. GO:{ a:undefined }
  3. GO:{ a:undefined , fn:function(a){ var a = 2; function a() {}; console.log(a); }
  • 执行
  1. GO:{ }
  2. GO:{ a:1 }
  3. GO:{ a:undefined , fn:function(a){ var a = 2; function a() {}; console.log(a); }
  • 碰见函数,进行函数预编译-->AO
  1. AO:{ }
  2. AO:{ a:undefined;(这里是a:undefined;(形参)a:undefined;(变量)) }
  3. AO:{ a:3(fn(3)), }
  4. AO:{ a:function(){}, (a:3;a:function(){};最后得出的结果) }
  • 执行函数

    AO:{ a:2, }

实例二

代码

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

fn(1);

分析

css 复制代码
GO:{
    fn:function fn(){}
}

AO:{
    a:undefined-->undefined-->1-->function a(){},  -->123,
    b:undefined,  -->function b(){},
    c:undefined-->function c(){},  -->123

实例三

代码

javascript 复制代码
function test(a, b) {
    console.log(a);//1
    c = 0
    var c;
    a = 3
    b = 2
    console.log(b);//2
    function b() {}
    console.log(b);//2
  }
  test(1)

分析

css 复制代码
GO:{
    test:function
}

AO:{
    a:undefined-->1,  -->3
    b:undefined-->undefined-->function b(){},  -->2
    c:undefined, -->0
    
}
相关推荐
狂奔蜗牛(bradley)11 小时前
深度学习三大基础激活函数详解:Sigmoid、Tanh、ReLU 公式、导数、图像与优缺点对比
人工智能·深度学习
船厂电气自动化ai大模型11 小时前
AI大模型与数学 第32课 函数凹凸性与二阶导数:拐点求解、凹凸区间计算(10道二阶导数计算题)
数据结构·人工智能·python·深度学习·算法
小O的算法实验室13 小时前
IEEE TII,学习为多目标深度学习生成偏好
人工智能·深度学习·学习
江畔柳前堤14 小时前
Function Calling 与 Tool Calling:从认知到工程的全景深度解析
开发语言·网络·人工智能·深度学习·算法·机器学习·php
qq_4221525716 小时前
Token到底是什么?Tokenizer分词机制与中文token开销入门科普
人工智能·python·深度学习
AndrewHZ16 小时前
【LLM技术全景】RAG 从原理到实战——检索增强生成完整指南
人工智能·深度学习·算法·llm·检索增强·生成式模型·rag
夏文强16 小时前
AI 技术全景架构科普:从算法到应用的一整套技术栈
人工智能·深度学习·机器学习·大语言模型·技术架构
是上好佳佳佳呀18 小时前
【深度学习|DAY04】神经网络深度学习笔记(下):损失函数、优化器与正则化
笔记·深度学习·神经网络
阿图灵18 小时前
基于 GRU 的 Seq2Seq 中英机器翻译:从 Tatoeba 语料到 BLEU 0.195
深度学习·gru·nlp·机器翻译·seq2seq
今天AI了吗20 小时前
从 LLM 到 Agent Skill:把 AI 底层概念串起来
数据库·人工智能·sql·深度学习·神经网络·算法·机器学习