当内部函数被保存到外部时,将会产生闭包。闭包会导致原有作用域链不会释放,造成内存泄露。
闭包的作用:
闭包的防范:
//闭包实现累加器
function add() {
var count = 0;
function demo() {
count ++;
document.write(count);
}
return demo;
}
var counter = add();
counter();
counter();
counter();
counter();
counter();
counter();
counter();
//例题1 输出为0
function a() { function b() { var bb = 234; aa = 0; } var aa = 123; b(); document.write(aa); } var glob = 100; a();
//例题2 输出为123
function a() { function b() { var bbb = 234; document.write(aaa); } var aaa = 123; return b;//将b返回,使得b在a销毁时自己AO时,继续存在 } var glob = 100; var demo = a(); demo();
//例题3 输出为101 102
function a() { var num = 100; function b() { num ++; document.write(num); } return b; } var demo = a(); demo(); demo();
//例题4 输出为101 100
function test() { var num = 100; function a() { num ++; document.write(num); } function b() { num --; document.write(num); } return [a,b]; } var myArr = test(); myArr[0](); myArr[1]();
//例题5 输出i am eating banana
function eater() { var food = ""; var obj = { eat : function () { document.write("i am eating" + food); food = ""; }, push : function (myFood) { food = myFood; } } return obj; } var eater1 = eater(); eater1.push('banana'); eater1.eat();
//例题6 输出10 10 10 10 10 10 10 10 10 10
function test() { var arr = []; for (var i = 0;i < 10;i++){ arr[i] = function () { document.write(i + " "); } } return arr; } var myArr = test(); for (var j =0;j < 10;j++){ myArr[j](); }解释:a[i]在在test内定义,但并不执行,此时a[i]=函数体; 执行时,i已经结束循环,值为10;此时a[i]执行函数体,i都为10
//例题7 输出0 1 2 3 4 5 6 7 8 9
function test() { var arr = []; for (var i = 0;i < 10;i++){ (function (j) { arr[j] = function () { document.write(j + " "); } }(i)); } return arr; } var myArr = test(); for (var j =0;j < 10;j++){ myArr[j](); }每个a[j]= function () {
document.write(j + " "); }
立即执行函数使得每次i被复制给j,但是最终i还是10
// 输出100
var demo; function test() { var abc = 100; function a() { document.write(abc); } demo = a; } test(); demo();
但凡内部函数被保存到外部,一定产生闭包
闭包作缓存
function test() { var food = 'apple'; var obj = { eatFood : function () { if(food != ""){ document.write("i am eating" + food); food = ""; }else{ document.write("there is nothing !"); } }, pushFood : function (myFood) { food = myFood; } } return obj; } var person = test(); person.eatFood(); person.eatFood(); person.pushFood("banana"); person.eatFood();