8

是否有任何壓縮器負責移除不在應用程序中的任何位置調用的開關盒?使用JavaScript從開關盒中刪除死代碼

function execute_case(id) { 
    switch(id) { 
    case 0: 
     console.log("0"); 
     break; 
    case 1: 
     console.log("1"); 
     break; 
    case 2: 
     console.log("2"); 
     break; 
    case 3: 
     console.log("3"); 
     break; 
    default: 
     console.log("default"); 
     break; 
    } 
} 

execute_case(1); 

如果以上所有我有,那麼理論上情況下0,2,3是死碼,將永遠不會執行。縮小代碼時,任何壓縮器是否具有刪除此代碼的智能?

我正在看一個在switch語句中有超過200,000個案例的代碼片段,因此也是一個問題。

感謝, -Vikrant

+0

因爲你必須弄髒你的手與垃圾收集stuff.i會說..只是享受你的編碼 –

+5

我不願意問,但是,200K案例陳述? WTF? –

+0

編譯器無法知道底部的行是唯一可以調用函數的地方。稍後您可能會加載其他一些JS文件,並且可能會調用該函數,並使用不同的參數。 – Barmar

回答

3

不,先生,

由於id是一個變量,無壓縮機將 「知道」 這不可能發生。壓縮機不會分析switch語句中的變量值並知道如何刪除它們。

如果你「知道」這些情況不會發生,只需自己刪除它們。

+0

事實上,太多的「假設」,以保證一個案件不會被打(如果它傳遞了一個變量,如果該變量來自AJAX調用怎麼辦,如果涉及數學會怎麼樣,如果...... ) –

+0

命令聲明,布拉德。我希望OP可以聽。 –

+1

我想他期待編譯器注意到函數只能從一個地方調用,並且該地方有一個常量參數,所以它可以不斷傳播到函數定義中。 – Barmar

3

沒有什麼會明確給你一個死亡案件陳述清單。如果它說可以沒有其他值的可能性(有限的代碼分支)或者說謊。所以除非你知道可以傳遞給execute_case的每個可能的值,否則你將會處於黑暗中。 (我假設你沒有提出這個問題)。

什麼可以做的是在該代碼中放置一個小型記錄器,輸出/記錄傳遞給該開關的值。然後,在[很多]時間和/或幾千次執行中,追蹤哪些正在被擊中,哪些未被擊中。我不一定會刪除那些沒有被擊中的,但也許嘗試貶低他們,並等待更長的時間/更多的執行,直到你得出結論,它不再是必要的。

+0

好吧,在這種情況下,我有辦法找到所有可能的電話。這裏沒有動態調用。所有都是直接調用,其中交換機ID明確是一個數字。所以,這將花費我一個grep | uniq獲取所有有效的案例。但該集合仍然非常大(200K)手動刪除。而且還有這樣的危險,即如果由於我們添加了新的東西而導致今天未使用的某些情況明天被使用,那麼我們將不得不重新執行它。縮小器會照顧所有這一切。可能是具有特殊情況的縮小器(對於這種情況爲--strict_case_minification) – v2b