javascript预编译流程详解(代码片段)

author author     2023-02-28     405

关键词:

1-JavaScript运行三部曲

1.语法分析
2.预编译
3.解释执行

语法分析很简单,就是引擎检查你的代码有没有什么低级的语法错误; 解释执行顾名思义便是执行代码了; 预编译简单理解就是在内存中开辟一些空间,存放一些变量与函数 ;

2-JS预编译什么时候发生

预编译到底什么时候发生? 误以为预编译仅仅发生在script内代码块执行前 这倒并没有错 预编译确确实实在script代码内执行前发生了 但是它大部分会发生在函数执行前

3-实例分析

先来区分理解一下这2个概念: 变量声明 var ... 函数声明 function()


<script>
var a = 1;
console.log(a);
function test(a) 
  console.log(a);
  var a = 123;
  console.log(a);
  function a() 
  console.log(a);
  var b = function() 
  console.log(b);
  function d() 

var c = function ()
console.log("I at C function");

console.log(c);
test(2);
</script>

分析过程如下:

页面产生便创建了GO全局对象(Global Object)(也就是window对象);

第一个脚本文件加载;

脚本加载完毕后,分析语法是否合法;

开始预编译 查找变量声明,作为GO属性,值赋予undefined; 查找函数声明,作为GO属性,值赋予函数体;
预编译


//抽象描述
    GO/window = 
        a: undefined,
        c: undefined,
        test: function(a) 
            console.log(a);
            var a = 123;
            console.log(a);
            function a() 
            console.log(a);
            var b = function() 
            console.log(b);
            function d() 
        
    

解释执行代码(直到执行调用函数test(2)语句)


//抽象描述
    GO/window = 
        a: 1,
        c: function ()
            console.log("I at C function");
        
        test: function(a) 
            console.log(a);
            var a = 123;
            console.log(a);
            function a() 
            console.log(a);
            var b = function() 
            console.log(b);
            function d() 
        
    

执行函数test()之前,发生预编译

1.创建AO活动对象(Active Object);
2.查找形参和变量声明,值赋予undefined;
3.实参值赋给形参;
4.查找函数声明,值赋予函数体;

预编译之前面1、2两小步如下:


//抽象描述
    AO = 
        a:undefined,
        b:undefined,
    

预编译之第3步如下:

//抽象描述
        AO = 
            a:2,
            b:undefined,
        

预编译之第4步如下:


//抽象描述
    AO = 
        a:function a() ,
        b:undefined
        d:function d() 
    

执行test()函数时如下过程变化:


//抽象描述
    AO = 
        a:function a() ,
        b:undefined
        d:function d() 
    
    --->
    AO = 
        a:123,
        b:undefined
        d:function d() 
    
    --->
    AO = 
        a:123,
        b:function() 
        d:function d() 
    

执行结果:

技术分享图片

注意:

预编译阶段发生变量声明和函数声明,没有初始化行为(赋值),匿名函数不参与预编译 ; 只有在解释执行阶段才会进行变量初始化 ;

预编译(函数执行前)

1.创建AO对象(Active Object)
2.查找函数形参及函数内变量声明,形参名及变量名作为AO对象的属性,值为undefined
3.实参形参相统一,实参值赋给形参
4.查找函数声明,函数名作为AO对象的属性,值为函数引用

预编译(脚本代码块script执行前)

查找全局变量声明(包括隐式全局变量声明,省略var声明),变量名作全局对象的属性,值为undefined
查找函数声明,函数名作为全局对象的属性,值为函数引用

预编译小结

预编译两个小规则

函数声明整体提升-(具体点说,无论函数调用和声明的位置是前是后,系统总会把函数声明移到调用前面)
变量 声明提升-(具体点说,无论变量调用和声明的位置是前是后,系统总会把声明移到调用前,注意仅仅只是声明,所以值是undefined)
预编译前奏

imply global 即任何变量,如果未经声明就赋值,则此变量就位全局变量所有。(全局域就是Window)
一切声明的全局变量,全是window的属性; var a = 12;等同于Window.a = 12;
函数预编译发生在函数执行前一刻。

这里推荐一下我的前端学习交流群:731771211,里面都是学习前端的从最基础的HTML+CSS+JS【炫酷特效,游戏,插件封装,设计模式】到移动端HTML5的项目实战的学习资料都有整理,送给每一位前端小伙伴。2019最新技术,与企业需求同步。好友都在里面学习交流,每天都会有大牛定时讲解前端技术!

点击:加入

javascript预编译(代码片段)

预编译分为两种:函数预编译(函数执行的前一刻执行)全局预编译(页面加载完成时执行)函数执行编译步骤:创建ActivationObject找形参和变量声明,将变量声明和形参作为AO的属性名,值为undefined将实参和形参值统一在函数体内找函... 查看详情

javascript预编译(代码片段)

预编译分为两种:函数预编译(函数执行的前一刻执行)全局预编译(页面加载完成时执行)函数执行编译步骤:创建ActivationObject找形参和变量声明,将变量声明和形参作为AO的属性名,值为undefined将实参和形参值统一在函数体内找函... 查看详情

javascript之预编译学习(附带多个面试题)(代码片段)

前言在学习JavaScript预编译之前,先了解一下JavaScript从编译到执行的过程,大致分为四步:词法分析语法分析:检查代码是否存在错误,若有错误,引擎会抛出语法错误。同时会构建一颗抽象语法树(AST)。... 查看详情

javascript之预编译学习(附带多个面试题)(代码片段)

前言在学习JavaScript预编译之前,先了解一下JavaScript从编译到执行的过程,大致分为四步:词法分析语法分析:检查代码是否存在错误,若有错误,引擎会抛出语法错误。同时会构建一颗抽象语法树(AST)。... 查看详情

源代码到可执行程序的过程详解:预编译编译汇编链接(代码片段)

1、gcc编译过程分解(1)首先是将.c源文件和.h头文件经过预编译(cpp是预编译器),得到.i文件,主要是进行的一些替换工作;(2)将.i文件经过编译器(gcc)处理,得到.s汇编文件,现在文件内容已经从C语言编程了汇编... 查看详情

5分钟教你读懂javascript预编译和函数执行(代码片段)

JavaScript运行三部曲JavaScript在展示页面之前会提前进行编译,因此也称之为预编译,而预编译基本分为三部分    语法分析----  (有没有基本的语法错误,例如中文,关键字错误...)    词法分析(预编译... 查看详情

预编译(代码片段)

javascript预编译部分  JavaScript当中不向其他的语言一样,在js中我们会看到一些奇怪的现象就像我们可以在函数声明之前去访问这个函数的名字,并且能够打印出函数体,而且我们还能在变量声明之前去访问这个变量,虽然值... 查看详情

javascript正则表达式简单字符串搜索/替换转义方法(使用re速度增强-预编译)(代码片段)

查看详情

javascript经典面试题详解(代码片段)

...需要引擎,编译器,作用域的配合操作,(引擎负责整个JavaScript程序的编译及执行过程,编译器负责词法分析及代码生成等,作用域负责收集并维护由所有声明的标识 查看详情

javascript的预编译和执行

 JavaScript引擎,不是逐条解释执行javascript代码,而是按照代码块一段段解释执行。所谓代码块就是使用<script>标签分隔的代码段。整个代码块共有两个阶段,预编译阶段和执行阶段一、编译阶段对于常见编译型语言(例... 查看详情

c语言中程序的编译(预处理操作)+链接详解(详细介绍程序预编译过程)(代码片段)

...则3.2.4#和##3.2.5带副作用的宏参数3.3宏和函数的对比4.条件编译4.1常见的条件编译指令4.2文件包含4.3嵌套文件包含5.结尾1.前言今天我们来学习C语言中程序的编译和链接是如何进行的。在ANSIC的任何一种实现中,存在两个不同的... 查看详情

你不知道的javascript1(作用域与闭包)(代码片段)

1.编译原理:首先,JavaScript是解释性语言,编译一行,执行一行JavaScript运行三部曲:1.语法分析2.预编译3.解释执行语法分析:js引擎来检查代码是否存在语法错误预编译:简单理解,就是在内存中开辟一些空间来声明存放一些变... 查看详情

浅谈javascript预编译原理

这两天又把js的基础重新复习了一下,很多不懂得还是得回归基础,大家都知道js是解释性语言,就是编译一行执行一行,但是在执行的之前,系统会做一些工作:1,语法分析;2,预编译;3,解释执行。语法分析很简单,就是引擎... 查看详情

hivesql源码之语法词法编译文件解析一文详解(代码片段)

目录前言一、HiveSQL编译流程二、Antrl三、ANTLRWorks参阅前言工欲善其事必先利其器,首先要了解HiveSQL的编译语法的流程,还是需要懂得HiveSQL的执行流程以及编译规则。曾经在Hive数仓搭建的时候写过部分HiveSQL编译原理࿱... 查看详情

javascript预编译

...详细讲解一下大家要明白,这个预编译和编译是不一样的JavaScript是解释型语言,既然是解释型语言,就是编译一行,执行一行传统的编译会经历很多步骤,分词、解析、代码生成什么的日后有时间再给大家科普下 查看详情

typescript实例_手动编译与自动编译类型注解接口和类的详解(代码片段)

...Script是一种由微软开发的开源、跨平台的编程语言。它是JavaScript的超集,最终会被编译为JavaScript代码。2012年10月,微软发布了首个公开版本的TypeScript,2013年6月19日,在经历了一个预览版之后微软正式发布了正式版TypeScriptTypeScr... 查看详情

javascript预加载图像(代码片段)

查看详情

javascript预加载图像(代码片段)

查看详情