この記事では、JavaScript での eval 関数の使用法を例とともに分析します。皆さんの参考に共有してください。具体的な分析は次のとおりです。
eval() にはパラメータが 1 つだけあります。渡されたパラメータが文字列でない場合、このパラメータは直接返されます。それ以外の場合、文字列は js コードとしてコンパイルされ、コンパイルが失敗すると、構文エラー (SyntaxError) 例外がスローされます。コンパイルが成功すると、コードが実行され、文字列内の最後の式またはステートメントの値が返されます。最後の式またはステートメントに値がない場合は、unknown が返されます。文字列が例外をスローした場合、その例外は呼び出しを eval();
に渡します。eval() について最も重要なことは、それが呼び出される変数スコープ環境を使用することです。つまり、変数の値の検索と新しい変数と関数の定義の操作は、コードとまったく同じです。ローカルスコープ内で。
eval("var x = 100"); eval("var y = 11"); console.log(x * y); //x * y == 1100 eval("function foo(x){return Math.pow(x,x);}"); console.log(foo(5)); // 25
eval 文字列が実行されるコンテキストは、関数が呼び出されるコンテキストと同じであるため、関数の一部として実行することはできません:
var foo = function(a){ eval(a); }; foo("return;");
上記のコードで eval(a) が実行されるコンテキストはグローバルであるため、グローバル コンテキストで return を使用すると、構文エラーがスローされます: return not in function。
eval() にはローカル変数を変更する機能がありますが、これは JS オプティマイザーにとって大きな問題です。 js インタープリターの実装を簡素化するために、ECMAScript3 標準では、どのインタープリターでも eval() にエイリアスを割り当てることができないと規定されています。エイリアスを介して eval() 関数が呼び出された場合、EvalError 例外がスローされます。
実際、ほとんどの実装はこのようなものではありません。エイリアスを通じて呼び出された場合、 eval() はその文字列をトップレベルのグローバル コードとして実行します。コードを実行すると、新しいグローバル変数やグローバル関数を定義したり、グローバル変数に値を割り当てたりすることがありますが、メインの呼び出し関数でローカル変数を使用したり変更したりすることはできないため、関数内のコードの最適化には影響しません。
ECMAScript5 では、態度が異なります。EvalError 例外をスローすることに反対します。 ECMAScript5 では、非修飾名を使用して eval() 関数が直接呼び出される場合、通常は「direct eval (direct eval)」と呼ばれます。eval() が直接呼び出される場合、関数は常にその関数が含まれるコンテキスト スコープ内で実行されます。と呼ばれた。他の間接呼び出しはグローバル オブジェクトをコンテキスト スコープとして使用するため、ローカル変数や関数の読み取り、書き込み、定義はできません。 (しかし実際には、firebug テストでグローバル変数が変更されていることがわかりました:( )
コード セグメントの実行に実際の eval が必要になるシナリオはほとんどありません。グローバル eval がローカル eval よりも頻繁に使用されます。
IE9 より前の初期バージョンの IE は、エイリアスを介して eval() を呼び出すときにグローバル eval ではありませんでしたが、IE はグローバル eval の機能を完了するために execScript() のグローバル関数を定義しました (シングルコア eval() は少し異なります)。 execScript () は常に null を返します)。
ECMAScript5 厳密モードでは、eval 関数の動作にさらに多くの制限が課されます。 「use strict」ディレクティブで始まる eval または strict モードの eval を使用するコードを実行する場合、eval はプライベート コンテキストのローカル eval です。また、strict モードでは eval が予約語としてリストされ、これにより eval() がより演算子のようになります。 eval() 関数はエイリアスでオーバーライドできず、変数名、関数名、関数パラメータ、または例外キャプチャ パラメータに「eval」という名前を付けることはできません。
この記事が皆様の JavaScript プログラミング設計に役立つことを願っています。