2

いくつかのレガシー PHP および JavaScript コードをデバッグおよびアップグレードしていますが、削除できない eval() 関数がいくつか見つかりました。C/C++ などのコンパイル済み言語を使用するデスクトップ プログラミング環境から来て、主にその存在を知らなかったために、javascript で eval() 関数を使用したことがありません。私はしばらくグーグルで調べてきましたが、読んだすべてのことから、 eval() が文字列を正当な JavaScript コードであるかのように評価して実行することを理解しています。動的プロパティへのアクセスと JSON オブジェクトのデコードに使用されていた eval() 関数を取り除くことができましたが、eval() を使用するかなり高度な (そして不明瞭な) クラス定義があり、それを無効にすることはできませんでした。 .

サンプルコード:

 function Ddl(N) {
   this.lyr = document.getElementById(N);
   this.obj = N+"DDL_Lyr";
   eval(this.obj+"=this");
   this.lyr.setAttribute("onchange", this.obj+".onChange();");
 }

この関数はオブジェクト コンストラクターです。DDL オブジェクトは Web ページで次のように使用されます。

 ddl_name = new Ddl('id_of_select');
 ddl_name.onChange = event_function;

私が知っている限りでeval(this.obj + "=this")は、と同じはずですがthis.obj = this;、onchange イベント関数event_functionは起動されません。なぜfirebugを使用するのか推測できませんでした。使用するthis.obj = thisと、this.obj の値がid_of_selectDDL_LyrDDL オブジェクト自体へのポインターに変化するのがわかるので、setAttribute が失敗する理由を理解できますが、eval() 関数を使用しても this.obj、コードが実行されたときに変更が反映されていないように見えます。常に「id_of_selectDDL_Lyr」のままですが、コメントアウトするとonchangeイベントが発生しないため、何かを実行しています。

eval() 呼び出しが別のスコープで実行されることを読んだので、ローカルまたはグローバルスコープに関連している可能性がありますが、それを確認する方法も、 eval() を通常のスコープに置き換える方法もわかりませんジャバスクリプトコード。

4

2 に答える 2

1

このコードは同等だと思います

function Ddl(N) {
   var self = this;
   this.lyr = document.getElementById(N);
   this.obj = N + "DDL_Lyr";
   window[this.obj] = this;
   this.lyr.onchange = function() {
       self.onChange();
   };
}

これは、 「N + DDL_Lyr」という名前の新しいグローバル変数を作成しているevalと言っているのではありません(変数はどこにありますか)。this.obj = thisN

于 2012-05-09T09:30:20.800 に答える
-1

変化する

this.lyr.setAttribute("onchange", this.obj+".onChange();");

this.lyr.onchange = this.obj+".onChange();";
于 2012-05-09T09:31:18.247 に答える