函数预编译过程:AO对象
AO对象的的加载顺序;
函数执行的时候AO就会创建出来
初始化四个步骤:
1、创建AO对象(activation object);AO()
2、将函数所有的形参(函数传进来的参数)以及变量声明存储到AO对象中;value为undefined
3、将形参和实参统一
4、将所有的函数声明的函数名作为key,函数整体内容作为value存储到ao对象中 (函数覆盖变量)
//GO和AO;AO示例
function test(a,b){
console.log(a); //function a(){}
console.log(c); //function c(){}
var c = 123;
console.log(c); //123
function a(){}
console.log(b); //3
function c(){}
var b = function cd(){}
console.log(b) //function cd(){}
}
test(1,3);
/**
AO是个隐式对象;他不是一个arguments对象;但是arguments对象是包含在AO对象之中的
AO预编译过程:
1:
AO:{
}
2:只是将变量声明;只管形参变量将其放入AO中,不管函数
AO:{
//arguments:undefined, //内置对象
a:undefined, //形参
b:undefined, //形参
c:undefined //变量提升
//遇到var b = function cd(){}的时候因为已经有了,那么就会忽略它
}
3:形参和实参统一
AO:{
a:1,
b:3,
c:undefined
}
4:将函数名作为key,函数体作为value存储进AO
AO:{
a:function a(){}, //有声明函数a
b:3, //并未声明函数b;b知识一个变量等于一个函数bc,所以此处不进行赋值函数
c:function c(){}, //有声明函数c
cd:function()
}
//上面四步骤都是函数预编译的过程中发生的四件事情;下面开始执行函数
执行的时候开始赋值;此时又上网易一次执行赋值
AO:{
a:function a(){},
b:function cd(), //将function cd(){}赋值给了b,因此在此之后b的值是一个function cd(){}
c:123, //此时由于赋值原因此时c的值为123
cd:function()
}
**/
//GO和AO一样都是预加载;相当于有一个window{}对象
//任何AO都有两个内置对象;this和arguments
//产生三层作用域链
//第三层(GO)
function a(){
//第二层(AO)
function b(){ //[[Scopes]].length == 3
//第一层(AO)
var bb = 234;
}
var aa = 123;
b();
}
var glob = 100;
console.log(glob) //100
function glob(){}
a();
/**
GO预编译过程:
1:创建对象
GO:{
}
2:变量初始化;value为undefined
GO:{
glob:undefined
}
3#4:形参实参统一,全局没有可以忽略;第四部函数key为函数米那个,value为函数体存储
GO:{
glob:function glob(){},
a:function a(){}
}
GO执行:
GO:{
glob:100
}
**/
V8浏览器引擎。V8解析js的工具。
栈:存储变量的定义
堆:(包含函数定义区;函数缓存区)
池:放常量
所有变量中存储的都是内存地址。操作变量即是操作内存空间。
GO:全局作用域,预加载全局变量;window
AO:局部作用域
案例1:
案例2: