2015-10-20 72 views
0

可達代碼爲什麼有SIMPLE_OPTIMIZATIONS谷歌關閉編譯器不會刪除標@define註釋

/** 
* @define {boolean} 
*/ 
var TEST = false; 
(function() { 
    if (TEST) { 
     foo(); 
    } 
})(); 

,而是我得到以下編譯後的代碼不會導致一個空字符串?

var TEST=!1;(function(){TEST&&foo()})(); 

if不可達,但關閉編譯器不會刪除代碼。
「高級優化」結果是我期望的結果(空),但「簡單優化」給出了上述結果。爲什麼這個區別?在這兩種情況下,代碼都不會執行。

編輯
如果我刪除關閉之後,if塊也會被刪除。爲什麼封閉這不會發生?

回答

1

我相信它會被刪除,如果使用「高級優化」

+0

是的,但爲什麼使用「簡單優化」的代碼不會被刪除? – raxell

+0

嗯,因爲這是一個被認爲是「高級」的優化:) 我不確定簡單/高級拆分是如何確定的,說實話。 – MatrixFrog

+3

簡單優化只進行本地優化(僅限一個或多個函數內的值)。全局值不會被移動,內聯等。它很「簡單」,因爲您不需要遵循任何特定的編碼風格才能使其工作。高級模式是不同的:如果你不導出編譯器試圖刪除它的東西。這可能會破壞帶有外部引用的代碼。 – John