资讯专栏INFORMATION COLUMN

JavaScript的预编译过程分析

graf / 3286人阅读

摘要:一概念是一个单线程解释型的编程语言。预编译大致可分为步创建对象找形参和变量声明,将形参和变量名作为属性名,值为将实参值和形参统一在函数体里面找函数声明,值赋予函数体。

一、JavaScript概念

JavaScript ( JS ) 是一个单线程、解释型的编程语言。

二、JavaScript语言特点 2.1 单线程

JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。

2.2 解释型语言

自上而下,解释一行,执行一行;不会通篇编译为一个文件再执行。

三、 JavaScript执行过程 3.1 语法分析

顾名思义 就是检查一遍js代码内有没有出现语法错误(比如少些个分号,多写个括号等);语法分析期间不会执行代码

3.2 预编译

预编译发生在函数执行的前一刻
全局下:
全局的变量声明和函数声明则会存放在全局对象内(Global Object 简称GO,它是window的一部分,你可以直接把他理解成window对象)中
函数体内:
预编译会提前把函数里的变量声明和函数声明依据规则存放在该活动对象内(Activation Object,简称AO),

预编译简单理解就是在内存中开辟一些空间,存放一些变量与函数 。

预编译大致可分为4步:

创建AO(GO)对象

找形参和变量声明,将形参和变量名作为AO(GO)属性名,值为undefined

将实参值和形参统一

在函数体里面找函数声明,值赋予函数体。

所以如果遇到下面这种情况,当函数声明和变量声明名称相同时:

console.log(a); 
var a= 1;
function a(){};

编译后的代码其实是:

var a;
function a(){};
console.log(a);
a= 1;

所以最后输出的是:

function a() {}
预编译小节

预编译两个小规则

函数声明整体提升—(具体点说,无论函数调用和声明的位置是前是后,系统总会把函数声明移到调用前面)

变量 声明提升—(具体点说,无论变量调用和声明的位置是前是后,系统总会把声明移到调用前,注意仅仅只是声明,所以值是undefined),只有在解释执行阶段才会进行变量初始化,匿名函数不参与预编译。

预编译前奏

imply global 即任何变量,如果未经声明就赋值,则此变量就位全局变量所有(全局域就是window) 。

一切声明的全局变量,全是window的属性。

3.3 解释执行

预编译完毕之后,JavaScript 脚本开始执行,执行顺序按照从上到下的顺序执行。

总结

JavaScript执行顺序

语法分析

预编译
2.1. 创建AO(GO)对象
2.2. 找形参和变量声明,将形参和变量名作为AO(GO)属性名,值为undefined
2.3. 将实参值和形参统一
2.4. 在函数体里面找函数声明,值赋予函数体。

解释执行

练习:

function a(a){
    console.log(a);
    a= 2;
    console.log(b);
    var b= 3;
    console.log(a);
}
a(1);
console.log(a);

你可以先试想一下结果,然后复制代码到控制台去验证你的答案是否正确。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/99921.html

相关文章

  • JavaScript的预编译过程与作用域

    摘要:词法作用域是一种静态作用域这个例子的结果按静态作用域来分析执行函数,先从函数内部查找是否有局部变量,如果没有,就根据书写的位置,查找上面一层的代码,也就是等于,所以结果会打印。静态作用域,决定的是作用域链的顺序。 博客原文地址:https://finget.github.io/2018/03/01/javascriptPrecompile/看不明白的地方欢迎提问,有理解的不对的地方希望...

    ziwenxie 评论0 收藏0
  • JavaScript-预编译

    摘要:预编译发生在函数执行前也就是说函数执行时,预编译已经结束。五总结理解预编译需要明白变量函数声明和变量赋值。预编译阶段,只进行变量函数声明,不会进行变量的初始化即变量赋值,所有变量的值都是变量赋值是在解释执行阶段才进行的。 一、JS的概念 JavaScript ( JS ) 是一种具有函数优先的轻量级解释型或即时编译型的编程语言。 二、JS语言特点 2.1 单线程 (1)JavaScri...

    Aldous 评论0 收藏0
  • 开发者的进阶之路:用语法树来实现预编译

    摘要:借助语法树,开发者能够更好地展现和修改源程序代码,优化开发环节,提高安全系数,还能进一步实现安卓预编译。用语法树来实现预编译指令开发者还能用语法树来实现预编译指令,常见的预编译指令主要分为条件编译宏定义文件包含三大类。 如何在保证安全性的前提下,提升开发过程的效率,是每个开发者都在不断探索的问题。借助语法树,开发者能够更好地展现和修改源程序代码,优化开发环节,提高安全系数,还能进一步实...

    CoffeX 评论0 收藏0
  • 【JDBC系列】从源码角度理解JDBC和Mysql的预编译特性

    摘要:我们对语句做适当改变,就完成了注入,因为普通的不会对做任何处理,该例中单引号后的生效,拉出了所有数据。查询资料后,发现还要开启一个参数,让端缓存,缓存是级别的。结论是个好东西。 背景 最近因为工作调整的关系,都在和数据库打交道,增加了许多和JDBC亲密接触的机会,其实我们用的是Mybatis啦。知其然,知其所以然,是我们工程师童鞋们应该追求的事情,能够帮助你更好的理解这个技术,面对问题...

    longshengwang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<