js 内存进阶 function扫描解析

<!DOCTYPE html>
<html>
<head>
  <title></title>
</head>
<body>
  <script type="text/javascript">
    //情况1
    var fn = function(){ //在栈中,匿名函数,赋值给变量
      alert(1);
    };
    function fn(){ //在堆中 有名字的函数
      alert(2);
    }
    fn(); // 1
    //调用函数的时候先去栈中找有没有定义fn的变量,如果有就根据变量存储的内存地址来执行这个函数
    //先定义后执行


    //情况2
    /*

    var fn1 = 3;
    function fn1(){
      alert(4);
    }
    fn1(); //fn1 not a function
    */

    //情况3
    var fn2; //已定义未赋值的变量为undefined
    function fn2(){
      alert(5);
    }
    fn2(); //5
    //如果fn变量,没有存储内存地址则为undefined,那么就去堆中看看有没有fn的引用名称

    //情况4
    fn3();   //6     //3.调用fn3
    var fn3;    //1.先定义fn3   //4.undefined,去堆中找
    function fn3(){    //2.再定义函数fn3()    //执行 结果为6
      alert(6);
    }


    //情况5
    fn4();    //8    //3.调用fn4()
    var fn4 = 7;   //1.定义变量fn4  //4.赋值
    function fn4(){    //2.定义函数fn4()
      alert(8);
    }

    //情况6
    var fn5;  //1.定义fn5    //3.未赋值  undefined
    fn5();   //9   //调用执行fn5(),发现fn5未赋值,直接去堆中找fn5()
    function fn5(){  2.定义函数fn5()
      alert(9);
    }

    //情况7
    var fn6 = 10;  //1.先定义fn6     //3.将10赋值给fn6
    fn6();   //fn6 not a function  //4.调用执行fn6(),fn6  not a function
    function fn6(){  //定义函数fn6()
      alert(11);
    }
  </script>
</body>
</html>

原文地址:https://www.cnblogs.com/52fe/p/7826378.html