1,闭包形成原因
来看下面的例子:
function fn(){
var a = 1;
function b(){
a++;
console.log(a);
}
return b;
}
var f=fn();
f();//2
f();//3
首先我们来分析fn函数在js预加载时候做了什么,fn会形成一个AO,
第一步 :AO形成
第二步:变量声明和函数声明在AO生成:
AO{
a:undefined;
b:undefined;
};
第三步:将形参和实参进行统一:
AO{
a:1;
b:undefined;
};
第4步 将所有的函数声明的函数名作为ao对象中的key,函数整体内容作为value写入:
AO{
a:1;
b:function(){};
};
同时在全局也会形成一个GO{
f:functon(){
var a = 1;
function b(){
a++;
console.log(a);
}
return b;
},
其他........}
当函数f(),执行时,GO-》访问fn的AO并执行并且将b的AO给返回出来了,GO{
f:function(){ a++;
console.log(a);}
},同时fn关闭对GO的访问通道,依照函数垃圾回收机制,执行,但此时b的AO中已经指向fn的AO,GO-》bAO-》fnAO