1 预解析函数
1.1 预解析的基本步骤内存
在JS引擎执行JS代码会分红三个步骤进行解析代码:作用域
第一步:JS引擎先将JS代码总体按照JS语言的规则进行分词,也就是JS代码的词法分析.io
第二步:而后JS引擎浏览JS代码,并对代码进行语法分析,这里只关注代码中变量的声明和函数的声明,这第二步也就叫预解析.function
第三步:从上往下,从左到右的执行代码.变量
第一和第二步都是在执行代码前JS引擎内部执行的过程,尤为是第二步预解析的过程对JS代码的执行顺序有着极其重要的影响.语法
而对于变量的声明和函数的声明,这两种声明在执行预解析的时候效果也是不一样的.语言
1.2 变量声明的预解析过程数字
变量的声明是经过关键字var来实现的
.当JS引擎遇到var时会首先在当前做用域中查找是否有声明过这个变量名,若是没有就在当前做用域中添加这个变量,若是有那该次声明就被视为无效.
1.3 函数声明的预解析
函数的声明分为两种:
经过function函数声明的方式声明函数,在预解析的时候,首先在当前做用域中查找是否有声明过这个函数名的变量,若是没有在当前做用域中添加该函数名的变量,若是有则再也不重复声明,而后给这个变量进行赋值,赋的值就是这个函数.
可是经过函数字面量方式声明的函数就至关于变量的声明,因此函数字面量声明的状况和变量声明的预解析过程同样.不考虑赋值语句后面的执行.
1.4 预解析的影响
在执行代码前会,预解析过程会在各自做用域中将执行全部声明语句,这样咱们就会以为预解析将声明语句进行了提高.
须要注意的是,声明的变量仍是属于各自的做用域,预解析的过程不存在改变变量的做用域.
1.5 词法做用域
词法做用域指的是从代码的可读区域到不可读区域,造成的密闭的独立的内存空间.
在每一个词法做用域都会执行一遍新的词法分析,语法分析,执行代码三个JS引擎步骤,而且不影响其余词法做用域.
在JS中函数是一个密闭的独立的内存空间,因此函数就是一个词法做用域.