读书笔记:
1、闭包使用动机:
1):将函数的内部变量暴露出来;
2):将函数内部变量驻留在内存中。
2、闭包使用方式:
1)使用函数体内部的全局变量和匿名函数
function Obj(){
var vars = [];
//addVar是函数体内的全局变量,匿名方法是闭包(其引用了Obj()方法中的临时变量vars)
addVar = function(newVar){
vars.push(newVar);
}
//readVars是函数体内的全局变量,匿名方法是闭包(其引用了Obj()方法中的临时变量vars)
readVars = function(){
alert(vars);
}
}
//Obj()调用后,会初始化函数体内的全局变量addVar和readVars
Obj();
addVar("1");
addVar("esdsdg");
readVars();//显示1,esdsdg
addVar("fdsafadsf");
readVars();//显示1,esdsdg,fdsafadsf
/*
总结:
在全局变量addVar和readVars初始化后,因为addVar和readVars引用了闭包(匿名方法),而
而匿名方法又引用了Obj()方法体内的临时变量。所以,在全局变量addVar和readVars不释放前,Obj()将
不会释放并且临时变量vars将一直驻留在内存中。
*/
2)将内部函数作为返回值,将内部函数(闭包)暴露
function newObj(){
var vars = [];
//闭包addVar,引用了vars
function addVar(newVar){
vars.push(newVar);
alert(vars);
}
//通过返回值的方式将闭包函数暴露
return addVar;
}
//objRef引用了闭包函数addVar()
var objRef = newObj();
objRef("t1");//t1
objRef("t2");//t1,t2
/*
总结:
1、函数通过返回值的方式将闭包函数暴露;
2、bjRef引用了闭包函数addVar(),闭包函数使用newObj()函数中的临时变量vars
3、在bjRef不释放的情况下,newObj()不会被释放
*/
3、引用关系为3个+的时候,对象才不会释放,或者会被回收机制回收。
好文推荐:
http://www.jb51.net/article/24101.htm