javascriptにおけるeval関数の使い方分析
2038 ワード
本論文の実例はjavascriptにおけるeval関数の使用法を分析した.皆さんの参考にしてください.具体的な分析は以下の通りです.
eval()はパラメータが一つしかありません.入力されたパラメータが文字列ではない場合、直接にこのパラメータを返します.文字列はjsコードとしてコンパイルされます.もしコンパイルが失敗したら、構文エラー(SyntaxErr)が発生します.コンパイルが成功したらこのコードの実行を開始し、文字列の最後の表現またはステートメントの値を返します.最後の表現またはステートメントに値がない場合は、最終的にundefinedを返します.文字列に異常がある場合、この異常はevalに呼び出されます.
eval()が最も重要なのは、変数の値を検索し、新しい変数と関数を定義する動作と、ローカルスコープのコードが完全に同じである変数のスコープ環境を呼び出して使用することである.
eval()は局所変数を修正する能力を持ち、これはjs最適化器にとって大きな問題である.jsインタプリタをより簡略化するために、ECMAScript 3標準では、いずれのインタプリタもevalErrerに別名を付与することを許さないと規定しています.eval関数がエイリアス呼出によって一つのEveralErr異常を投げ出します.実際に大多数の実現はこのようなものではない.エイリアスで呼び出すと、eval()はその文字列をトップレベルのグローバルコードとして実行します.コードを実行すると、新しいグローバル変数と大域関数を定義したり、大域変数に値を割り当てたりすることができますが、基調関数内の局所変数を使用または変更することはできませんので、関数内部のコード最適化には影響しません.ECMAScript 5では、態度が違っています.Evarrを投げ出すことに反対します.ECMAScript 5において、名来を限定しないでeval()関数を呼び出す場合、通常は「直接eval(direct eval)」と呼ばれます.直接eval()を呼び出すと、いつもそのコンテキストスコープ内で実行されます.他の間接的な呼び出しは、大域オブジェクトをそのコンテキストスコープとして使用し、読み書きと関数の定義ができません.(しかし、実際にfirebugテストで見つけました.全部グローバル変数を修正しました.()
本当にevalがコードセグメントを実行する必要があるシーンは多くないです.ローカルevalではなくグローバルevalがより多く使われるかもしれません.
IE 9の前の初期バージョンIEは、別名でeval()を呼び出した場合、グローバルevalではないが、IEはexecScript()のグローバル関数を定義してグローバルevalの機能(シングルコアeval()を完了する.execScript()は常にnullに戻る.
ECMAScript 5厳格モードは、eval関数の挙動に対してより多くの制限を与えています.厳格なモードでは、evalまたはevalを使用してコードを実行します.「use strict」コマンドを開始すると、evalはプライベートコンテキスト環境の中の局所的なevalです.また、厳格なモードではevalを保留文字にしています.これは、eval()より一つの演算子のようになり、別名でeval()を上書きすることができません.関数として、変数名、関数名、関数パラメータ、または異常取得パラメータのいずれも「eval」と名づけられません.
本論文で述べたように、皆さんのjavascriptプログラムの設計に役に立ちます.
eval()はパラメータが一つしかありません.入力されたパラメータが文字列ではない場合、直接にこのパラメータを返します.文字列はjsコードとしてコンパイルされます.もしコンパイルが失敗したら、構文エラー(SyntaxErr)が発生します.コンパイルが成功したらこのコードの実行を開始し、文字列の最後の表現またはステートメントの値を返します.最後の表現またはステートメントに値がない場合は、最終的にundefinedを返します.文字列に異常がある場合、この異常は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インタプリタをより簡略化するために、ECMAScript 3標準では、いずれのインタプリタもevalErrerに別名を付与することを許さないと規定しています.eval関数がエイリアス呼出によって一つのEveralErr異常を投げ出します.実際に大多数の実現はこのようなものではない.エイリアスで呼び出すと、eval()はその文字列をトップレベルのグローバルコードとして実行します.コードを実行すると、新しいグローバル変数と大域関数を定義したり、大域変数に値を割り当てたりすることができますが、基調関数内の局所変数を使用または変更することはできませんので、関数内部のコード最適化には影響しません.ECMAScript 5では、態度が違っています.Evarrを投げ出すことに反対します.ECMAScript 5において、名来を限定しないでeval()関数を呼び出す場合、通常は「直接eval(direct eval)」と呼ばれます.直接eval()を呼び出すと、いつもそのコンテキストスコープ内で実行されます.他の間接的な呼び出しは、大域オブジェクトをそのコンテキストスコープとして使用し、読み書きと関数の定義ができません.(しかし、実際にfirebugテストで見つけました.全部グローバル変数を修正しました.()
本当にevalがコードセグメントを実行する必要があるシーンは多くないです.ローカルevalではなくグローバルevalがより多く使われるかもしれません.
IE 9の前の初期バージョンIEは、別名でeval()を呼び出した場合、グローバルevalではないが、IEはexecScript()のグローバル関数を定義してグローバルevalの機能(シングルコアeval()を完了する.execScript()は常にnullに戻る.
ECMAScript 5厳格モードは、eval関数の挙動に対してより多くの制限を与えています.厳格なモードでは、evalまたはevalを使用してコードを実行します.「use strict」コマンドを開始すると、evalはプライベートコンテキスト環境の中の局所的なevalです.また、厳格なモードではevalを保留文字にしています.これは、eval()より一つの演算子のようになり、別名でeval()を上書きすることができません.関数として、変数名、関数名、関数パラメータ、または異常取得パラメータのいずれも「eval」と名づけられません.
本論文で述べたように、皆さんのjavascriptプログラムの設計に役に立ちます.