闭包、做用域链

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时又会开辟一个环境,这两个环境并不干扰,没有任何联系。
以上就是我对闭包的一点拙见,可能有不对的地方(全凭我的乱想),请大佬指正!函数

相关文章
相关标签/搜索