什么闭包?闭包的作用有哪些?闭包的注意事项

当内部函数被保存到外部时,将会生成闭包。闭包会导致原有作用域链不释放,造成内存泄漏。
直接看一个示例
我想让数组的每一项都是一个函数,并且调用该函数的时候输出的是数组该项的下标

        var arr = [];
        for(var i = 0;i < 5;i ++) {
            arr[i] = function() {
                console.log(i);
            };
        }
        arr[0]();//5

arr0;的结果是5
我们可以根据闭包的特性,将内部的变量保存到外部,这个变量在函数执行后不会被销毁

        for(var i = 0;i < 5;i ++) {
            (function(i){
                arr[i] = function() {
                    console.log(i);
                }
            })(i);
        }
        arr[0]();//0

在arr[i] = function(){}外面再套一个立即执行函数,并且把i当作实参传给立即执行函数的形参,每循环一次则立即执行一次,并且将这个i保存到了外部的数组arr中,从而让这个i变得私有化。

闭包的好处

  • 1.希望一个变量常驻在内存当中
  • 2.避免全局变量污染
  • 3.可以声明私有成员

假设有两个人在定义变量的时候,变量的名字是一样的,则可用闭包使得每个人定义的变量私有化,以下示例

        var part1 = (function(){
            var count = 10;
            function aaa(){
                count +=2;
                alert(count);
            }
            return {
                funcA: aaa
            }
        })();

        var part2 = (function(){
            var count = 10;
            function aaa(){
                count +=10;
                alert(count);
            }
            return {
                funcA: aaa
            }
        })();
        part1.funcA();
        part2.funcA();

在这里插入图片描述
在这里插入图片描述
闭包的注意事项
私有化变量一直占用内存怎么办

<body>
    <button id="div">点击</button>
    <script>
        window.onload = function() {
            var div = document.getElementById("div");
            div.onclick = function() {
                alert(div.id);
            }
        }
    </script>
</body>
<body>
    <button id="div">点击</button>
    <script>
        window.onload = function() {
            var div = document.getElementById("div");
            var id = div.id;
            div.onclick = function() {
                alert(id);
            }
            div = null;
        }
    </script>
</body>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

boboj1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值