いくつかのレガシー 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_Lyr
DDL オブジェクト自体へのポインターに変化するのがわかるので、setAttribute が失敗する理由を理解できますが、eval() 関数を使用しても this.obj
、コードが実行されたときに変更が反映されていないように見えます。常に「id_of_selectDDL_Lyr」のままですが、コメントアウトするとonchangeイベントが発生しないため、何かを実行しています。
eval() 呼び出しが別のスコープで実行されることを読んだので、ローカルまたはグローバルスコープに関連している可能性がありますが、それを確認する方法も、 eval() を通常のスコープに置き換える方法もわかりませんジャバスクリプトコード。