? ? ? ? 使用具備垃圾收集機制的語言編寫程序,開發人員一般不必操心內存管理的問題。但是,JavaScript在進行內存管理及垃圾收集時面臨的問題還是有點與眾不同。其中最主要的一個問題,就是分配給Web瀏覽器的可用內存數量通常要比分配給桌面應用程序的少。這樣做的目的主要是出于安全方面的考慮,目的是防止運行JavaScript的網頁耗盡全部系統內存而導致系統崩潰。內存限制問題不僅僅會影響給變量分配內存,同時還會影響調用棧以及在一個線程中能夠同時執行的語句數量。
? ? ? ? 因此,確保占用最少的內存可以讓頁面獲得更好的性能。而優化內存占用的最佳方式,就是為執行中的代碼值保存必要的數據。一旦數據不再有用,最好通過將其值設置為null來釋放其引用——這個做法叫做解除引用(dereferencing)。這一做法適用于大多數全局變量和全局對象的屬性。局部變量會在它們離開執行環境時自動解除引用。如下面這個例子所示:
function createPerson(name){var localPerson = new Object();localPerson.name = name;return localPerson;}var globalPerson = createPerson("scott");// do something ...// 手工解除 globalPerson 的引用globalPerson = null;
? ? ? ? 在這個例子中,變量globalPerson取得了createPerson()函數返回的值。在createPerson()函數內部,我們創建了一個對象并將其賦給局部變量localPerson,然后又為該對象添加了一個名為globalPerson。由于localPerson在createPerson()函數執行完畢后就離開了其執行環境,因此無需我們顯式地為它解除引用。但是對于全局變量globalPerson而言,則需要我們在不使用它的時候手工為它解除引用,這也正是上面例子中最后一行代碼的目的。
? ? ? ?不過,解除一個值的引用并不意味著自動回收該值所占用的內存。解除引用的真正作用是讓值脫離執行環境,以便垃圾收集器下次運行時將其回收。