2013-02-04 47 views
3

根據文檔(https://developers.google.com/closure/compiler/docs/api-tutorial3#externs),當沒有外部聲明存在時(包括從外部位代碼使用函數/變量時),封閉編譯器似乎應該重命名變量。他們給出的例子是爲什麼Google Closure Compiler不重命名這些外部變量?

function makeNoteDom(noteTitle, noteContent, noteContainer) { 
    // Create DOM structure to represent the note. 
    var headerElement = textDiv(noteTitle); 
    var contentElement = textDiv(noteContent); 
... 
} 

其中textDiv函數在全局範圍內由某種第三方庫聲明。它說textDiv應該是外部聲明,以防止重命名。

我的問題是 - 當我將此代碼或類似代碼放入Closure Compiler而沒有任何extern聲明時,爲什麼textDiv沒有重命名(這會破壞代碼),正如文檔所指出的那樣?

回答

2

編譯器假定對未定義函數的調用實際上是對外部函數的調用。使用命令行編譯器,可以使用--warning_level VERBOSE讓編譯器將此情況視爲錯誤。

Web Application主要是爲演示而構建的,默認情況下爲此。雖然您可以設置VERBOSE警告級別,但它不會更改此功能。有關選項的信息,請參閱Additional Web Service Options頁面。我已經提交了關於此的bug report

由於屬性的重命名算法,如果未在externs中的對象上聲明相同的屬性名稱,未聲明的屬性將以突破方式重命名。

+0

另外:http://code.google.com/p/closure-compiler/wiki/FAQ#Some_of_my_properties_are_getting_renamed,_but_some_aren't。 – John

相關問題