歡迎光臨
每天分享高質量文章

閉包拾遺 & 垃圾回收機制

閉包拾遺

之前寫了篇《閉包初窺》,談了一些我對閉包的淺顯認識,在前文基礎上,補充並且更新些對於閉包的認識。

還是之前的那個經典的例子,來補充些經典的解釋。

function outerFn() {

var a = 0;

function innerFn() {

 console.log(a++);

}

return innerFn;

}




var fn = outerFn();

fn();

// 0

fn();

// 1

這裡並沒有在outerFn內部修改全域性變數,而是從outerFn中傳回了一個對innerFn的取用。通過呼叫outerFn能夠獲得這個取用,而且這個取用可以可以儲存在變數中。 這種即使離開函式作用域的情況下仍然能夠通過取用呼叫內部函式的事實,意味著只要存在呼叫內部函式的可能,JavaScript就需要保留被取用的函式。而且JavaScript運行時需要跟蹤取用這個內部函式的所有變數,直到最後一個變數廢棄,JavaScript的垃圾收集器才能釋放相應的記憶體空間。

讓我們說的更透徹一些。所謂“閉包”,就是在建構式體內定義另外的函式作為標的物件的方法函式,而這個物件的方法函式反過來取用外層函式體中的臨時變數。這使得只要標的物件在生存期內始終能保持其方法,就能間接保持原建構式體當時用到的臨時變數值。儘管最開始的建構式呼叫已經結束,臨時變數的名稱也都消失了,但在標的物件的方法內卻始終能取用到該變數的值,而且該值只能通這種方法來訪問。即使再次呼叫相同的建構式,但只會生成新物件和方法,新的臨時變數只是對應新的值,和上次那次呼叫的是各自獨立的。

還是前文的例子:


  • 0
  • 1
  • 2
  • 3
  • 4

赞(0)

分享創造快樂