预解析过程:
1.把var申明的变量提升到当前作用域的最前边,不会提升赋值
2.把函数申明提升盗作用域的最前边
3.如果函数同名,后者会覆盖前者
4.如果var申明的和函数申明的同名,函数优先
案例:
1.
 <script>
    var num = 10;
    fn1();
    function fn1() {
      console.log(num)
      var num = 20
    }
  </script>
预解析后:
 <script>
    var num = 10;
    function fn1() {
      var num
      console.log(num) //10
      num = 20
    }
    fn1();
  </script>
打印结果:undefined
2.
<script> fn(); console.log(c); console.log(b); console.log(a); function fn() { var a = b = c = 9; console.log(a); console.log(b); console.log(b); } </script>
预解析后:
<script> function fn() { var a = 9; //局部 b=9; //隐式全局 c=9; //隐式全局 console.log(a); console.log(b); console.log(c); } fn() console.log(c); console.log(b); console.log(a); </script>
打印结果:
9 9 9 9 9 报错
原文:https://www.cnblogs.com/zhaodz/p/11590615.html