閉包、做用域鏈

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時又會開闢一個環境,這兩個環境並不干擾,沒有任何聯繫。
以上就是我對閉包的一點拙見,可能有不對的地方(全憑我的亂想),請大佬指正!函數

相關文章
相關標籤/搜索