標籤:
閉包是指有權訪問另一個函數範圍中的變數的函數(有點拗口吧),簡單點就是在一個函數的內部建立另外一個函數,並返回這個函數的引用。(這也是建立閉包的常用方式)
function outerFunc (outerNum) { return function innerFunc(innerNum) { outerNum=outerNum+innerNum; return outerNum; }}var inner=outerFunc(1);var a1=inner(11);console.log(a1)//輸出為12var a2=inner(2);console.log(a2)//輸出為14
上面的代碼就建立了一個閉包,裡面的innerFunc有權訪問外面函數的變數outerNum。
不明白,沒關係,我們先看執行這個函數的記憶體情況
在JavaScript裡面,有一個概念叫做範圍,我們定義一個下面的函數
function sample (value1,value2) { var temp; temp=value1+value1; return temp;}var result=sample(5,6);
當sample函數執行時的範圍鏈如下
背景每個執行環境都有一個表示變數的對象(變數對象)。全域環境的變數對象始終存在,而像sample()函數這樣的局部環境變數對象,則只在函數的執行過程中存在。
當sample(5,6)執行完畢後,sample的執行環境的範圍鏈就會被銷毀,sample()的使用中的物件就沒有被引用了,那麼sample()的使用中的物件就會被銷毀,如的紅色虛線框表示就要被銷毀的。因為全域變數對象是需要整個執行環境被銷毀才會被銷毀(整個程式執行完畢,程式退出後)。
現在我們回到最初的閉包,看看這個閉包的範圍鏈又是怎樣的
如,當outerFunc(1)執行後,outerFunc的執行環境範圍鏈就要被銷毀,就是紅色虛線框的部分表示被銷毀的,本來outerFunc()的使用中的物件也是要被銷毀的,但是系統檢測到,outerFunc()的使用中的物件還被innerFunc的執行環境範圍鏈引用,所以它就被儲存了下來,也就是說裡面的值也被儲存了下來
執行完inner(11)後,outerNum=12,再執行inner(2)的話,outerNum=14
理解JavaScript閉包