JS 的预编译
首先要了解一下js的执行过程,分三步
JS的执行过程
-
语法检测
-
预编译
-
逐行执行
JS预编译
var a
function fun(){
}
function abc(){
}
function a(){
}
console.log(a);
var a = 100;
console.log(a);
}
预编译阶段会做如下的操作:
-
会生成一个对象,这个对象封装的就是作用域,称为GO(global object)。当全部挂载完成之后,然后代码在去逐行执行
GO={}
-
分析变量声明(var)——变量作为GO对象的属性名 ,初始值为undefined
GO={ a:undefined; }
-
分析函数声明(function)——函数名作为GO对象的属性名,值为函数体(如果遇到同名,直接覆盖
GO={ a:undefined, fun:function fun(){} abc:function abc(){} }
-
当走到某一行的时候;a产生了一次赋值;此时GO对象变成了:
GO={ a:100, fun:function fun(){} abc:function; }
-
逐行执行
什么是AO
AO是函数执行前的一瞬间,生成一个AO对象(在函数执行前的一瞬间会生成自己的AO,如果函数执行2次,生成了两次AO,这两次的AO是没有任何关联 , 简单来讲就是描述函数执行方法的对象
-
执行前的一瞬间,会生成一个AO(action object)对象
-
分析参数,形参作为AO对象的属性名,实参作为AO对象的属性值
-
分析var变量声明,变量名作为AO对象的属性名,值为undefined,如果遇到同名的,不去做任何改变
-
分析函数声明,函数名作为AO对象的属性名,值为函数体,如果遇到同名的,直接覆盖