JavaScript预解析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript预解析相关的知识,希望对你有一定的参考价值。

1 预解析

1.1 预解析的基本步骤

在JS引擎执行JS代码会分成三个步骤进行解析代码:

第一步:JS引擎先将JS代码整体按照JS语言的规则进行分词,也就是JS代码的词法分析.

第二步:然后JS引擎浏览JS代码,并对代码进行语法分析,这里只关注代码中变量的声明和函数的声明,这第二步也就叫预解析.

第三步:从上往下,从左到右的执行代码.

第一和第二步都是在执行代码前JS引擎内部执行的过程,尤其是第二步预解析的过程对JS代码的执行顺序有着极其重要的影响.

而对于变量的声明和函数的声明,这两种声明在执行预解析的时候效果也是不同的.

1.2 变量声明的预解析过程

变量的声明是通过关键字var来实现的

.当JS引擎遇到var时会首先在当前作用域中查找是否有声明过这个变量名,如果没有就在当前作用域中添加这个变量,如果有那该次声明就被视为无效.

1.3 函数声明的预解析

函数的声明分为两种:

通过function函数声明的方式声明函数,在预解析的时候,首先在当前作用域中查找是否有声明过这个函数名的变量,如果没有在当前作用域中添加该函数名的变量,如果有则不再重复声明,然后给这个变量进行赋值,赋的值就是这个函数.

但是通过函数字面量方式声明的函数就相当于变量的声明,所以函数字面量声明的情况和变量声明的预解析过程一样.不考虑赋值语句后面的执行.

1.4 预解析的影响

在执行代码前会,预解析过程会在各自作用域中将执行所有声明语句,这样我们就会觉得预解析将声明语句进行了提升.

需要注意的是,声明的变量还是属于各自的作用域,预解析的过程不存在改变变量的作用域.

1.5 词法作用域

词法作用域指的是从代码的可读区域到不可读区域,形成的密闭的独立的内存空间.

在每个词法作用域都会执行一遍新的词法分析,语法分析,执行代码三个JS引擎步骤,并且不影响其他词法作用域.

在JS中函数是一个密闭的独立的内存空间,所以函数就是一个词法作用域.

以上是关于JavaScript预解析的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript-预解析

JavaScript 之 预解析

JavaScript 之 预解析

JavaScript 预解析

javascript预解析和作用域

翻译 – 解释JavaScript的“预解析(置顶解析)”