3

私のWebアプリケーションは、共通の関数とグローバル変数を定義する共通のスクリプトと、それらを処理する動的にロードされるスクリプトに基づいています。これまでのところ、グローバル変数をエクスポートするために私が見つけた唯一の方法は、すべてのオカレンスをで置き換えることですが、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

あなたのライトをどうもありがとう。

4

2 に答える 2

8

新しい答え

Closure-compilerは@nocollapse、プロパティがグローバル変数に折りたたまれるのを防ぐアノテーションをサポートしています。これにより、エクスポート時にプロパティを変更できるようになります。

@nocollapse名前の変更をブロックしません-それを実現するには、プロパティをエクスポートする必要があります。

@nocollapse現在、ソースからコンパイルする場合にのみサポートされています。次のリリース、つまりv20150315リリース以降のバージョンに含まれる予定です。

古い答え

@expose現在は非推奨です。コンパイラは、@expose

新しい、しかし今のところ文書化されていない、注釈があります:@expose。この単一のアノテーションは、プロパティをエクスポートし、コンストラクターから折りたたまれるのを防ぎます。状況にぴったりのように聞こえますが、変数がオブジェクトのプロパティである必要があります。

ただし、注意して使用してください。@exposeを持つプロパティは名前が変更されず、デッドコードとして削除されません。これにより、javascriptライブラリの作成者が使用する場合に特に問題が発生します。

于 2012-04-30T13:01:23.850 に答える
0

名前が変更されない変数が必要な場合は、たとえばprops.txt次の内容で呼び出されるファイルを作成するだけです。

myGlobalVar:myGlobalVar

次に、コードをコンパイルするときに、コマンドライン引数を追加します。--property_map_input_file props.txt

変数の名前は変更されず、最適化されていない限り、すべてのスクリプトで使用できます。また、まったく宣言しない場合(したがって省略した場合var myGlobalVar)、名前が変更されたり削除されたりすることはありません。

于 2012-05-03T18:34:40.263 に答える