作用域 预解析(变量提升)

作用域指的是:变量或函数的有效使用范围  有全局作用域域和局部作用域

(一)全局变量和局部变量

全局变量:直接在script标签下声明的变量 任何地方都能访问 任何地方都能对该值进行改变                局部变量:函数内部定义的变量 函数内能访问 出了函数括号就不能访问(垃圾回收)                  

1-全局变量或函数能在任何地方访问和修改

2-局部变量只能在函数内部访问

(二)预解析(变量提升)

浏览器在解析js代码的时候  会进行一个预解析的操作 会有一个js解析器(假设有的名字)里面会执行其中的两步   (不单单就这两步)

第一步      找一些东西(var function 参数)      第二步    逐行执行代码

比如                                                                                                                                                      1-                               找var 的时候  如果存在var关键字   则会将这个变量先存储下来 储存的形式为   var a =undefind    预解析的时候变量中存的就是undefind  等到逐行解析遇到表达式即   +  -  *  %  /  --  =  等操作才会改变变量的值 

上面的代码中 先找到var  存储a的值为undefined 所以打印的是undefined  然后再执行a=10

2-                             找function 的时候 会将整个函数保存下来

上面的代码中 函数会整个存储下来  如果里面有注释的话 也会存储注释

3-找参数的时候 即执行函数时 函数内部可以看作为一个小小的区域   有自己预解析参数  就跟变量var一样 

 函数内部会进行一个跟外部一样的预解析                                                                                              第一个a 在全局已经有变量 直接打印  a为10                                                                                         剩下的就是局部变量   里面的打印第一个a会 往上面找 没有找到就是undefined                                 全局变量的第二个a赋值为20 下面的打印 a 找到变量就是20

详情为下图解释  如果全局中 var在打印的后面 则  前面所有打印找不到赋值 都为undefined

你可能感兴趣的:(作用域 预解析(变量提升))