js预编译

1、js运行三部曲

  语法分析、预编译、解释执行

2、预编译

  预编译发生在函数执行的前一刻

  第一步:创建GO或AO对象(执行期上下文)

  第二步:将形参和var声明的变量作为AO的属性名,值为undefined

  第三步:将实参和形参统一

  第四步:在函数体里面找函数声明,将声明的函数名作为AO的属性名,值为函数体、

  实例1:

    function  fn(a){

      console.log(a)

      var  a  =  123;

      console.log(a)

      function  a  (){}

      console.log(a)

      var  b  =  function  ()  {}

      console.log(b)

    }

    fn(1)

    预编译过程

      第一步:创建AO对象  AO { }

      第二步:找形参和var声明的变量作为AO对象的属性,值为undefined

        AO {

          a: undefined,

          b: undefined

        }

      第三步:将实参和形参统一

        AO {

          a: 1,

          b: undefined

        }

      第四步:找函数声明,将声明的函数名作为AO对象的属性名,值为声明的函数体

        AO {

          a: function a(){},

          b: undefined

        }

      执行函数fn     

      function  fn(a){

        console.log(a)  // function a(){ }

        var  a  =  123;

        console.log(a)  // 123

        function  a  (){}

        console.log(a)  // 123

        var  b  =  function  ()  {}

        console.log(b)  // function (){ } 

    }

  

  实例2:

    function  test(a, b){

      console.log(a)  // 1

      c  =  0;

      var  c;

      a  =  3;

      b  =  2;

      console.log(b)  // 2

      function  b(){ }

      function  d(){ }  

      console.log(b)  // 2

    }

    test(1)

    预编译:

    AO {

      a: 1,

      b: function  b(){ },

      c: undefined,

      d: function  d(){ }

    }

原文地址:https://www.cnblogs.com/cuishuangshuang/p/13228168.html