闭包及例题

当内部函数被保存到外部时,将会产生闭包。闭包会导致原有作用域链不会释放,造成内存泄露。

闭包的作用:


闭包的防范:


//闭包实现累加器

 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();

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值