閉包和垃圾回收機制

1、什麼是作用域鏈?

作用域鏈:函數內部要使用變量,在函數內訪問某個變量是根據函數作用域鏈來判斷變量是否存在的,而函數作用域鏈是程序根據函數所在的執行環境棧來初始化的,

原型鏈:對象要使用某個屬性,

2.什麼是閉包以及閉包的使用場景,優缺點

場景:https://www.jianshu.com/p/132fb6d485ee

  • 通過循環給頁面上多個dom節點綁定事件
  • 封裝變量
  • 延續局部變量的壽命

優缺點:

優點1:變量長期駐紮在內存中;

           2:避免全局變量的污染;

           3:私有成員的存在 ;

特性:1:函數套函數;

           2:內部函數可以直接使用外部函數的局部變量或參數;

           3:變量或參數不會被垃圾回收機制回收 GC;

缺點:

    常駐內存 會增大內存的使用量 使用不當會造成內存泄露,詳解:

(1)由於閉包會使得函數中的變量都被保存在內存中,內存消耗很大,所以不能濫用閉包,否則會造成網頁的性能問題,在IE中可能導致內存泄露。解決方法是,在退出函數之前,將不使用的局部變量全部刪除。

(2)閉包會在父函數外部,改變父函數內部變量的值。所以,如果你把父函數當作對象(object)使用,把閉包當作它的公用方法(Public Method),把內部變量當作它的私有屬性(private value),這時一定要小心,不要隨便改變父函數內部變量的值。
 

3、js的垃圾回收機制

JS的垃圾回收機制是爲了以防內存泄漏

內存泄漏的含義就是當已經不需要某塊內存時這塊內存還存在着,垃圾回收機制就是間歇的不定期的尋找到不再使用的變量,並釋放掉它們所指向的內存。(尋找、銷燬變量+回收內存)

JS執行環境中的垃圾回收器怎樣才能檢測哪塊內存可以被回收有兩種方式:標記清除(mark and sweep)、引用計數(reference counting)。

3.1 標記清除(mark and sweep)

大部分瀏覽器以此方式進行垃圾回收,當變量進入執行環境(函數中聲明變量)的時候,垃圾回收器將其標記爲“進入環境”,當變量離開環境的時候(函數執行結束)將其標記爲“離開環境”,在離開環境之後還有的變量則是需要被刪除的變量。標記方式不定,可以是某個特殊位的反轉或維護一個列表等。

垃圾收集器給內存中的所有變量都加上標記,然後去掉環境中的變量以及被環境中的變量引用的變量的標記。在此之後再被加上的標記的變量即爲需要回收的變量,因爲環境中的變量已經無法訪問到這些變量。

3.2 引用計數(reference counting)

這種方式常常會引起內存泄漏,低版本的IE使用這種方式。機制就是跟蹤一個值的引用次數,當聲明一個變量並將一個引用類型賦值給該變量時該值引用次數加1,當這個變量指向其他一個時該值的引用次數便減一。當該值引用次數爲0時就會被回收。

該方式會引起內存泄漏的原因是它不能解決循環引用的問題.


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章