1.说到闭包大家可能会说函数套函数,延长作用域链。对没错,确实是这样的,但是你对他的理解是多少呢,函数闭包可以说的有很多,夸张的说,说个半天是绝对没问题的,它的用处非常多,作用也非常多,这个需要你多想想的,不多说,下面我们来看代码。

function A(){
        var x = 1;
        return function(){
            x++;
            console.log(x);
        }
    }
    var m1 = A();
    m1();//2
    m1();//3
    var m2 = A();
    m2();//2
    m1();//4

刚开始一直不明白为什么m1执行两次x的值会累加。我这属于没有明白函数的执行环境及作用域链。
当m1第一次执行时A()会在内存中开辟一个环境,然后返回函数也会开辟一个执行环境也就是大圈里面有个小圈,
此时小圈里的x时从大圈里拿的,然后会打印2,第二次执行m1时,由于第一次执行m1延长作用域链,也就是大小圈依然存在而且里面的x=2,
此时大圈将x的值重新赋值为1,但是小圈里的x依旧是2,当执行到x++是,
会检测当前环境是否有x,答案是有此时x=2,执行x++时就是2++,打印出来就是3,
当将A()给了m2时又会开辟一个环境,这两个环境并不干扰,没有任何联系。
以上就是我对闭包的一点拙见,可能有不对的地方(全凭个人乱想),请大佬指正!


一笔一划
9 声望0 粉丝