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