2010-01-22 43 views
1

Soooooooooooooooo ...如果條件評估爲false,javascript是否仍爲「IF」方案分配內存?

我看到一個聲明,如果現在將評估到的時間,其中包括支票的真實99.7%,如果瀏覽器的DOM 1+能力,然後加載的大塊碼。

因此,放置一個「if(true)」並省略「else」部分是合乎邏輯的,但我不知道在最終決定中斷執行之前,舊版瀏覽器是否仍會繼續解析代碼並分配內存。 ...

我不在乎這一點,因爲我們已經有10年以上的體面的瀏覽器,但爲了將來的參考,我希望有人知道。

我想我的問題或多或少是這樣的:瀏覽器解析整個文件並在執行第一個條件語句之前分配內存,這是第一個事情之前的第一件事?

在此先感謝:)

回答

2

有兩件事情從執行上下文中懸浮出來,並且即使代碼永遠不會到達,也會產生效果:functionvar

把一個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之前的版本。然而,這個瀏覽器是如此糟糕,幾乎沒有腳本會按原樣工作;幾乎所有的事情都需要解決方法。

+0

謝謝你這樣詳細的解釋! 我實際上沒有任何過時的瀏覽器的備份代碼,因此缺少「其他」,但我所做的只是檢查getElementById的存在。如果評估結果爲false,則不執行任何其他操作。讓任何超出他們能力的舊瀏覽器窒息。我很確定移動瀏覽器應該悄悄地出錯,但我只是很好:)再次感謝。你的解釋與JS引擎所期望的更接近,但從我的角度來看,這只是一個瘋狂的猜測 – Alin 2010-01-22 13:11:13

1

是的,瀏覽器將解析整個文件。至於「內存分配」部分。如果您的意思是「爲文件中定義的所有變量分配內存」,則不會,只有在執行流程到達該變量時才分配內存。

+0

只是好奇,你是基於對JS引擎的通用理解提到的嗎? – 2010-01-22 11:40:48

+0

謝謝:) 因此,看起來第一個條件可以充當「門」,並將內存使用量保持爲JS文件的大小,然後在用戶移動到下一頁時將其作爲GC_d ... 這是相當痛苦,恕我直言 – Alin 2010-01-22 11:53:33

+0

我主要擔心的是,JS引擎會映射內存的解析時遇到的對象的數量,但不一定填充任何東西。如果情況如此,它仍然是不必要的膨脹,但在某種程度上我會猜測它簡單地解析代碼並評估語句......有點像它們的隊列.... 再次感謝 – Alin 2010-01-22 11:59:55

相關問題