1

下面的代碼無用代碼:ClosureCompiler消除了與先進的優化

(function() { 
var hello = function(name) { 
    alert('Hello, ' + name); 
} 
hello('New user'); 
})(); 

ADVANCED_OPTIMIZATIONS被編譯爲:

alert("Hello, New user"); 

但這代碼:

(function() { 
var hello = function(name) { 
    alert('Hello, ' + name); 
} 
hello.a = 5; 
hello('New user'); 
})(); 

被編譯成:

function a(b){alert("Hello, "+b)}a.a=5;a("New user"); 

爲什麼它不能忽略hello.a = 5

(它不能被上下文之外使用,沒有eval,沒有[]並沒有new Function()。)

回答

2

對於這項工作,編譯器會需要確定,沒有人改爲「警戒」與功能看了看調用函數:

alert = function() { 
    console.log(arguments.callee.caller.a); 
} 

但「警報」是一個外部函數,所以沒有辦法確定其實際作用。一般來說,javascript是如此的易變,以至於可以安全地從函數中刪除屬性的情況非常罕見,不值得花費精力去找到它們。

一般來說,Closure編譯器可以刪除它的屬性是作弊。這裏有這樣一些討論:

https://github.com/google/closure-compiler/wiki/Understanding-Property-Removal

+0

+1謝謝你的解釋。 – 2013-05-14 19:32:35

0

,就可以幫助編譯器周圍的內置函數編寫的包裝優化這些:

function myalert(name){alert('Hello, ' + name)} 
(function() { 
var hello = function(name) { 
    myalert(name); 
} 
hello.a = 5; 
hello('New user'); 
})(); 

產地:

alert("Hello, New user"); 

這可以當您將常用的東西(如document.createElement())用於模糊處理和縮小範圍(未壓縮時)時也很有用。