js 预解析以及变量的提高

js在执行以前会进行预解析。es6

什么叫预解析?函数

预:提早spa

解析:编译code

预解析通俗的说:js在执行代码以前会读取js代码,会将变量声明提早。对象

  • 变量声明包含什么?一、var 声明 二、函数的显示声明。
  • 提早:是会将这些变量声明提早声明读取,避免在执行代码的过程当中出现未定义的问题。

注意:blog

  1.   只是提高变量,并非提高变量赋值
  2.   对于es6中的let不具体 变量提高。

例子:ip

1 <script>
2     test();
3     function test() {
4         console.log(222)
5     }
6 </script>

 

如上代码不并不会报错,由于在以前js代码以前,在预解析的时候,显示声明的函数 test 会声明提早。也就是当前做用域中的变量对象已经存在了函数test。因此不会报错。作用域

  • 执行环境:执行环境定义了变量和函数有权访问其余数据,每一个执行环境都有与之关联的变量对象。执行环境中的定义的变量和函数都存储在这个变量中。
  • 变量对象:变量对象咱们没法调用,可是在解析器处理数据的会在后台调用他。函数: 执行环境就是该函数能够调用的变量和数据。存储在变量对象中,当代码在环境中执行,会建立一个变量对象的做用域链。
  • 做用域链:保证对执行环境中的全部变量和函数有序访问。
  • 执行流:js代码执行从上到下依次执行。当执行流进行一个函数中,会将函数的执行环境(也叫作环境)推入一个环境栈中,而在函数执行完以后,会将该环境弹出,将控制权返回以前的执行环境中。js中的执行流就是经过该机制执行。
  • 标识符:代码中用来标识变量函数、或属性的字符序列。(https://developer.mozilla.org/zh-CN/docs/Glossary/Identifier)。命名规则和变量同样,首字母只能字母、下划线、$开头不能以数字开头。
  • 函数标识符解析:从当前函数的局部做用域查找,若是没有在向上做用域查找,依次回溯查找直到查到最外层全局做用域。若是没有会报错。

对于函数的声明的 提高只是针对显示声明的函数,对于函数表达式没有这个提高。get

1   a();
2     var  a=()=>{
3         console.log(22)
4     }

如上用var 声明a,提高了变量可是在预解析的时候a的值是undefined 并非函数因此会报a is not a function,变量的声明提早并非赋值提早!!input

函数表达式遵循的是先声明在调用的原则。

  var a=()=>{ console.log(22) }; a(); 

相关文章
相关标签/搜索