JS的预编译

7 min read

JS 的预编译

首先要了解一下js的执行过程,分三步

JS的执行过程

  1. 语法检测

  2. 预编译

  3. 逐行执行

JS预编译

var a
function fun(){

        }
        function abc(){

        }
        function a(){

        }
        console.log(a);
        var a = 100;
        console.log(a);
        

        }

预编译阶段会做如下的操作:

  1. 会生成一个对象,这个对象封装的就是作用域,称为GO(global object)。当全部挂载完成之后,然后代码在去逐行执行

    GO={}
    
  2. 分析变量声明(var)——变量作为GO对象的属性名 ,初始值为undefined

    GO={
    	a:undefined;
    }
    
  3. 分析函数声明(function)——函数名作为GO对象的属性名,值为函数体(如果遇到同名,直接覆盖

    GO={
    
         a:undefined,
    
         fun:function fun(){}
    
         abc:function abc(){}
    
    }
    

  1. 当走到某一行的时候;a产生了一次赋值;此时GO对象变成了:

    GO={
    
         a:100,
         fun:function fun(){}
         abc:function;
    
    }
    
  2. 逐行执行

什么是AO

AO是函数执行前的一瞬间,生成一个AO对象(在函数执行前的一瞬间会生成自己的AO,如果函数执行2次,生成了两次AO,这两次的AO是没有任何关联 , 简单来讲就是描述函数执行方法的对象

  1. 执行前的一瞬间,会生成一个AO(action object)对象

  2. 分析参数,形参作为AO对象的属性名,实参作为AO对象的属性值

  3. 分析var变量声明,变量名作为AO对象的属性名,值为undefined,如果遇到同名的,不去做任何改变

  4. 分析函数声明,函数名作为AO对象的属性名,值为函数体,如果遇到同名的,直接覆盖