1. 程式人生 > >js閉包和垃圾收集機制

js閉包和垃圾收集機制

 

1、JS的回收機制

JavaScript垃圾回收的機制很簡單:找出不再使用的變數,然後釋放掉其佔用的記憶體,但是這個過程不是實時的,因為其開銷比較大,所以垃圾回收系統(GC)會按照固定的時間間隔,週期性的執行。

到底哪個變數是沒有用的?所以垃圾收集器必須跟蹤到底哪個變數沒用,對於不再有用的變數打上標記,以備將來收回其記憶體。用於標記的無用變數的策略可能因實現而有所區別,通常情況下有兩種實現方式:標記清除和引用計數。引用計數不太常用,標記清除較為常用。

 

  準確來說,閉包是基於正常的垃圾回收處理機制下的。也就是說,一般情況一個函式(函式作用域)執行完畢,裡面宣告的變數會全部釋放,被垃圾回收器回收。但閉包利用一個技巧,讓作用域裡面的變數,在函式執行完之後依舊儲存沒有被垃圾回收處理掉。

  可以文字你不太喜歡看,那好,我直接上程式碼。這可能是很多解說閉包的案列,先拿來用再說

  function foo(x) {

     var  tmp = 3;      return  function  (y) {          alert(x + y + (++tmp));      }   }
  var  bar = foo(2);  // bar 現在是一個閉包   bar(10);

 我們來分析一下這一段程式碼,在foo中,宣告一個變數tmp,他屬於foo作用域下的變數。函式返回一個函式,這個函式被巢狀,函式內部彈出x+y(++tmp)。這是個人都看得懂啊,那為什麼會出現閉包,怎麼出現的了。這接下來就是看執行的過程了,首先執行var bar = foo(2);那麼foo就執行了,引數2也傳進去了,但是執行完畢之後,tmp變數以及引數x就已經被釋放回收了嗎?並沒有,因為返回值裡面還等待使用這些變數咯,所以此時,foo雖然執行了,但是foo的變數並沒有被釋放,在return在等待繼續使用這些變量了,這個時候bar就是一個閉包。

 

https://www.cnblogs.com/JIANGCHEN520/p/7118656.html

 

https://blog.csdn.net/michael8512/article/details/77888000