js闭包问题以及解决办法

个人理解闭包的产生主要就是:一切最外部的函数比里面的函数先执行,必然产生闭包,闭包会导致原有的作用域链不释放,造成内存泄漏

 

例子1

解析:实现上现在的demo保存的是function b()  a执行之后就销魂了自身的AO,但是此时b已经保存了a的AO

 



 

例子2

解析:为什么可以打印出123?因为函数内部的b函数并没有执行而是被保存到了外部,a函数先执行此时的aaa已经是123了,b又保存了a的执行期上下文

例子3

闭包的作用

1.实现共有变量(函数累加器)

 // 1111111111111111.
    function add() {
        var num = 0;
        function demo() {
            num++;
            console.log(num)
        }
        return demo();
    }
    var result = add();
    result();
    result();

2.可以做缓存

3.可以实现封装,属性私有化


 

4.模块化开发,防止污染全局变量

 

闭包的解决方法

1.立即执行函数

 
function text() {
        var arr = [];
        for (var i = 0; i < 10; i++) {
            (function (a) {
                arr[a] = function () {
                    console.log(a);
                } //保存的是立即执行函数的成果AO()
            }(i))

        }

        return arr;
    }

    var myarr = text();
    myarr[0](); //0
    myarr[1](); //1
    myarr[2](); //2

2.ES6 let声明变量----let定义变量

 function text() {
        var arr = [];
        for (let i = 0; i < 10; i++) {
            arr[i] = function () {
                console.log(i);
            }
        }
        return arr;
    }

    var myarr = text();
    myarr[0]();  //0
    myarr[1]();  //1
    myarr[2]();  //2

 

你可能感兴趣的:(js梳理)