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

        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>