JavaScript的規范(ECMA-262 ECMAScript)沒規定JavaScript引擎要如何實現對JavaScript對象的內存管理。實際實現中幾乎所有JavaScript引擎都使用基於跟蹤(trace)的GC來實現自動內存管理。
編寫JavaScript程序時只要管new出對象,JavaScript引擎在底下會通過分析對象圖的可到達性來判斷對象的存活,進而釋放掉已無活引用的對象。
所以要讓JavaScript引擎有機會釋放掉某個對象,就得確保整個程序里已經沒有對那個對象的活引用。
前面有人提到delete運算符,它可以用來刪除變量或屬性,但並不直接涉及刪除/釋放對象。如果指向某個對象的活引用當中有全局變量或別的對象的屬性,那用delete來刪除掉那些變量或屬性自然是有助減少活引用的個數。到完全沒有活引用指向該對象時,它就能在下次GC的時候被釋放掉。
編寫JavaScript程序時只要管new出對象,JavaScript引擎在底下會通過分析對象圖的可到達性來判斷對象的存活,進而釋放掉已無活引用的對象。
所以要讓JavaScript引擎有機會釋放掉某個對象,就得確保整個程序里已經沒有對那個對象的活引用。
前面有人提到delete運算符,它可以用來刪除變量或屬性,但並不直接涉及刪除/釋放對象。如果指向某個對象的活引用當中有全局變量或別的對象的屬性,那用delete來刪除掉那些變量或屬性自然是有助減少活引用的個數。到完全沒有活引用指向該對象時,它就能在下次GC的時候被釋放掉。
作者:RednaxelaFX
鏈接:http://www.zhihu.com/question/21628109/answer/18818671
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
有人說;只需要把變量對對象的引用斷開就可以了,如:var o = new Object(); o = null;