3

ClosureCompilerのADVANCED_OPTIMIZATIONSオプションで縮小できるようにしたいと思っているJavascriptライブラリを書いています。ライブラリには、範囲の下限と上限、文字列リテラルなどを設定する20個のグローバル変数が含まれている可能性があります。

これらの変数を他のソースファイルからアクセス可能にし、デッドコードの削除を回避するには、それらを「エクスポート」する必要があります。AdvancedCompilationとExternsを参照してください。

したがって、次の構文で変数を宣言するのではなく、次のようにします。

var fooMinValue = 10;

この構文を使用する予定です。

 window['fooMinValue'] = 10;

私はこれをテストしました、そしてそれはうまくいくようです。私の質問は、この構文を使用することの欠点はありますか?それはIE 6以降にリリースされたすべてのブラウザーでサポートされていますか?(または、まったく異なる手法を使用する必要がありますか?)

4

3 に答える 3

2

どちらもグローバルオブジェクトのプロパティですが、違いがあります。変数をで宣言するとvar、その[[Configurable]]内部属性はに設定されfalseます。Object.definePropertyしたがって、 (を除く)で属性を変更することはできません[[Value]]。最も顕著な効果は、そのような変数をdeletedにすることができないことです。

​var foo = 'bar';
window['bar'] = 'baz';
console.log(foo); // 'bar'
console.log(bar); // 'baz'
delete foo;       // doesn't work, you can't delete vars
delete bar;       // works, bar is an object property
console.log(foo); // 'bar'
console.log(bar); // ReferenceError

また、変数をプロパティに割り当てるときは、変数を参照する代わりに、値のコピーを作成します。これは、プロパティへの外部変更が変数の値に影響を与えないことを意味します。

(function() {
  var foo = 'bar';
  window['foo2'] = foo; //export foo
  console.log(foo);  // will output 'bar'
  setTimeout(function() { console.log(foo) }, 1000); //will output 'bar'
})();
window['foo2'] = 'baz';
console.log(window['foo2']); // will output 'baz'

上記のコードは、次の出力を生成します。

'bar'
'baz'
'bar'
于 2012-10-26T17:33:32.927 に答える
1

スクリプトがブラウザで実行されていない場合、ウィンドウが未定義になる可能性が非常に高いことを除いて、同じです。

どういたしまして!

于 2012-10-26T17:28:56.187 に答える
1

それが動作します; これは完全に有効な構文です。IE6以降でサポートされています。

デモ: http: //ie6test.it/?url = http://jsbin.com/usafeg/2

于 2012-10-26T17:29:39.813 に答える