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预解析的主要内容,如果未能解决你的问题,请参考以下文章