闭包、作用域链

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时又会拓荒一个环境,这两个环境并不滋扰,没有任何联络。
以上就是我对闭包的一点鄙见,能够有不对的处所(全凭个人乱想),请大佬斧正!

    原文作者:一笔一划
    原文地址: https://segmentfault.com/a/1190000018621582
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞