![](/img/trans.png)
[英]How to preserve global variables in javascript when using Closure compiler with advanced optimization?
[英]Javascript Closure compiler -Exporting global variables
我的webapp基於一個通用腳本,我在其中定義了常用函數和全局變量以及處理這些函數的動態加載腳本。 到目前為止,我發現導出全局變量的唯一方法是用window["myGlobalVar"]
替換任何出現但我發現它非常難看。 有更好的方法嗎?
這是一個例子
// commonscript.js before compilation
function incrementVariable() {window["myGlobalVar"]++;}
window["incrementVariable"] = incrementVariable;
window["myGlobalVar"] = 0;
在另一個腳本中
alert(myGlobalVar); // <= alerts 0
incrementVariable();
alert(myGlobalVar); // <= alerts 1
我正在尋找一種在兩個文件中直接使用myGlobalVar
的方法,因為它會更優雅。 但是,我需要將window["myGlobalVar"]
設置為指針而不是對象的副本,我不知道如何在簡單類型上執行此操作。
可能嗎? 將myGlobalVar
封裝在Object
是唯一的另一種方式嗎?
非常感謝您的燈光。
Closure-compiler支持@nocollapse
注釋,該注釋可防止屬性折疊為全局變量。 這允許屬性在導出時是可變的。
@nocollapse
不會阻止重命名 - 您仍需要導出屬性才能完成此操作。
目前僅在從源代碼編譯時支持@nocollapse
。 它將包含在下一個版本中 - 即v20150315版本之后的版本。
@expose
現已棄用。 編譯器將警告@expose
任何用法
有一個新的,但迄今為止沒有記載的文本:@expose。 此單個注釋將導出屬性並防止其從構造函數折疊。 它聽起來非常適合您的情況 - 但它需要您的變量作為對象的屬性。
但是,要小心使用。 任何具有@expose的屬性都不會被重命名,也不會被刪除為死代碼。 這使得javascript庫編寫者使用它尤其成問題。
如果您想擁有一個不會重命名的變量,只需創建一個名為props.txt
的文件, props.txt
包含以下內容:
myGlobalVar:myGlobalVar
然后在編譯代碼時,添加命令行參數: - --property_map_input_file props.txt
您的變量不會被重命名,只要它沒有被優化,所有腳本都可以使用它。 此外,如果您根本沒有聲明它(因此省略var myGlobalVar
),它將不會被重命名或刪除。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.