我一直在使用google閉包,試圖獲得大量的JavaScript編譯乾淨利用谷歌編譯器最小化。我碰到一個問題,但:Closure編譯器將閉包內部的定義視爲重定義
goog.provide('test');
goog.provide('test2');
/**
* @constructor
*/
test = function() {
this.x = 10;
this.y = 13;
};
(function() {
/**
* @constructor
*/
test2 = function() {
this.x = 10;
this.y = 13;
};
})();
前者是好的。後者產生恆定的重定義錯誤:
JSC_CONSTANT_REASSIGNED_VALUE_ERROR. constant test2 assigned a value more than once at /home/hbrown/tmp/closure-test/foo.js line 16 : 10
BUILD FAILED: 1 error(s), 0 warning(s)
是否有某種方式來強制plovr /關閉編譯器允許這種構造?我環顧四周,一無所獲。
稍後:爲什麼關閉/ plovr認爲test2是一個常量?我懷疑當goog.provide被調用時,它與plovr/closure爲test2創建的命名空間有關。當它生成錯誤時,看到它正在處理的中間表單將會很好。
Closure Compiler將全局級對象定義視爲與函數包裝器中定義的對象不同。當不在包裝封閉內部時,它會進行更多的優化。在你的情況下,它會崩潰goog.provide和test1的定義,所以你不會得到錯誤。 –
是否有你在函數閉包中聲明全局構造函數test2的原因?它應該真的是var test2嗎?該格式有點混亂,似乎可能導致錯誤。我提到這一點是因爲解決這個尷尬的語法可能也會解決你的Closure編譯器問題。 –
@Chris Moschini:是的,它確實是這樣的。 – hughdbrown