ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript_javascript スキルでの eval() 関数の使用の概要

JavaScript_javascript スキルでの eval() 関数の使用の概要

WBOY
WBOYオリジナル
2016-05-16 16:23:081417ブラウズ

JavaScript では、eval() 関数を使用して文字列内の JavaScript コードを解析し、対応するコードの実行結果を返すことができます。


コードをコピー コードは次のとおりです:

console.log(eval("42 * 2"));//84


基本的に、eval() は JavaScript グローバル オブジェクトの関数です。たとえば、上記のコードは次と同等です:


コードをコピー コードは次のとおりです:

console.log(this.eval("42 * 2"));//84


ただし、 eval() ステートメントを使用する場合、通常は上記の最初の方法、つまりグローバル オブジェクトを無視して eval() を直接使用する方法が採用されます。

eval() の使用法

次の 2 つの理由により、本当に必要な場合を除き、コード内で eval() ステートメントを使用することは避ける必要があります。

1. 論理的に言えば、文字列はプログラムの実行中にコンテンツと情報を保存するために使用されるべきであり、特定の計算ロジックを保存するために使用されるべきではありません。

2. eval() パラメータは文字列であり、文字列は字句的に処理できないため、JavaScript インタプリタは eval() 呼び出しステートメントを最適化できません。

eval() の戻り値

eval() の戻り値は次の規則に従います:

1. eval() のパラメータが文字列でない場合、eval() はパラメータを直接返します。

2. eval() のパラメータが文字列の場合、eval() はその文字列をコードに解析して実行し、コード実行の最後の行の結果を返します。
3. 文字列を正当なコードに解析できない場合、eval() は SyntaxError をスローします。
4. 文字列を正当なコードに解析できても、このコードの実行中にエラーが報告された場合、そのエラーは eval() ステートメントに報告され、eval() によってスローされます。

コードをコピーします コードは次のとおりです:
console.log(eval([1,2,3]));//[1, 2, 3]
console.log(typeof eval([1,2,3]));//object
console.log(eval("42 */ 2"));//SyntaxError

console.log(eval("42 * 2; 22 * 3;"));//66. eval は最後の式/ステートメントの結果を返します
console.log(eval("null.toString()"));//TypeError、eval されたコードの例外は eval() の外部に伝播されます。

変動する環境

JavaScript の Eval() には重要な機能があります。eval() パラメーター文字列内のコードは外部コード内の変数にアクセスでき、パラメーター文字列コード内に新しく作成された変数を外部コードに公開することもできます。つまり、eval() パラメータ文字列を合法的に解析できる場合、JS は eval() が配置されている行を解析されたコードで置き換えます:


コードをコピーします コードは次のとおりです:
//変数環境
var a = 108;
console.log(eval("function double(x){return x*2;} a = double(a)"));
console.log(a);//216
console.log(double(33));//66

上記の機能を実現するための前提条件は、eval() パラメータ文字列内のコードが合法的に解析できることであることに注意してください。コードの正しい構文に加えて、JS では eval() パラメータ文字列内のコードが「自己完結型」であることも必要です。つまり、コードはパラメータ文字列内のコードに関する限りにおいてのみ意味を持つ必要があります。たとえば、「return;」などの文字列を eval() 関数に渡すことはできません。


関数テスト(){
var s = "テスト";
eval("return s;");
}
test();//SyntaxError: return not in function


eval() 関数が直接使用される場合、eval() パラメータ文字列内のコードによってアクセスされる変数は、eval() ステートメントが配置されている関数の変数、つまり eval() によって使用される変数環境です。関数は「ローカル変数環境」です。 eval() 関数を直接使用せず、同じく eval() 関数を指す新しい変数を使用する場合、対応するパラメータ文字列内のコードによってアクセスされる変数はグローバル変数、つまり、 eval() 関数。環境は「グローバル変数環境」です:



コードをコピー コードは次のとおりです:

//ローカル変数環境とグローバル変数環境
var renamed = eval;
var x = "原点", y = "原点";
関数 f(){
var x = "新しい";
eval("x = '変更';");
x を返します;
}
関数 g(){
var y = "新しい";
renamed("y = '変更';");
y を返します;
}
console.log(f(), x);//new変更されたオリジン
console.log(g(), y);//新しいoriginChanged


ただし、IE6、7、および 8 では動作が異なることに注意してください。 IE6、7、8では、eval()関数の名前を変更しても「ローカル変数環境」がそのまま使用されます。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。