有兩件事情從執行上下文中懸浮出來,並且即使代碼永遠不會到達,也會產生效果:function
和var
。
把一個var
聲明在一個碼塊將「保留存儲器」該變量一旦塊被輸入,但該變量的值僅是一個指向undefined
對象,所以這只是一個平凡小字節數。
把一個function
語句中的碼塊都將「保留存儲器」爲變量並評估function
,分配所得Function
對象的變量,代碼塊中的第一行之前被執行。這就是你可以調用一個函數的方式,這個函數只在腳本的後面定義。
根據ECMAScript標準規則,您只能將function
語句放在代碼塊的根部;這就是說:
if (true) {
function f() {
...
}
}
是非法的。但是,瀏覽器通常仍然會允許它,而在瀏覽器之間進行瀏覽時會發生什麼情況。避免這種情況。 (也避免命名內聯函數表達式,這是錯誤地受限於IE的JScript的提升和雙評價)。
如果你真的想停止任何內存被分配變量和函數你不打算使用,把它們放在他們自己的功能塊中。無論如何,這是維護庫代碼中乾淨名稱空間的常用策略。例如:
if (condition) (function() {
var foo= 1;
function bar() {
alert(foo);
}
})();
通過這樣做可以節省的內存量非常小。
但今天的每個主要瀏覽器都是DOM級別1的能力;如果您的腳本中有備份代碼以支持Netscape 4,那麼過去很長的時間才能刪除它。現在基線桌面瀏覽器是IE6。
目前唯一使用的簡單DOM操作仍然是問題的瀏覽器是IEMobile,IEMobile 8/WinMobile 6.1.4之前的版本。然而,這個瀏覽器是如此糟糕,幾乎沒有腳本會按原樣工作;幾乎所有的事情都需要解決方法。
謝謝你這樣詳細的解釋! 我實際上沒有任何過時的瀏覽器的備份代碼,因此缺少「其他」,但我所做的只是檢查getElementById的存在。如果評估結果爲false,則不執行任何其他操作。讓任何超出他們能力的舊瀏覽器窒息。我很確定移動瀏覽器應該悄悄地出錯,但我只是很好:)再次感謝。你的解釋與JS引擎所期望的更接近,但從我的角度來看,這只是一個瘋狂的猜測 – Alin 2010-01-22 13:11:13