簡體   English   中英

Javascript Closure編譯器 - 導出全局變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM