2

次のような JS ファイルがあります。

var value = localStorage.getItem(somekey);
if ( !value )
{
  eval("value = String(" + somevariablename + ");");
}

このスクリプトは、ローカル ストレージから値を取得しようとします。値がローカル ストレージに存在しない場合は、以前に定義された変数の値の評価オフを使用するように設定されます。valueの値を変数名の文字列値に設定する必要があるため、この場合は eval が必要です。私はこれを回避する他の方法を知りません。

問題は、ほとんどの優れた JS Compressor が、スペースを節約するために変数名を自動的に変更する方法を提供していることです。私はこのようなものになります:

var f=localStorage.getItem(e);
if(!f){eval("value = String("+e+");")}

したがって、問題は、変数の名前が変更されたが、コンプレッサーが eval 文字列内の変数の名前を変更することを認識していないことです。それを理解できるほどスマートなコンプレッサーを見たことがありません。

ビルド環境で自動化された方法でこれを処理する最良の方法は何ですか? 私の場合、このようなコードが頻繁に発生するため、evals で変数名を手動で変更するのはかなり時間がかかります。

4

1 に答える 1

2

その場で変数を作成するために eval を使用しないでください。

グローバルオブジェクトをキャッチするだけで、その上に作成されたプロパティはグローバルスコープの変数になります...

window["値"] = "何か";

そして、この方法で変数を作成すると、変数名を文字列で作成しているため、 eval を使用して変数名を取得する必要がなくなります。

于 2012-12-11T06:19:58.143 に答える