ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScriptでのeval()関数の戻り値と変数環境の使用例を詳しく解説

JavaScriptでのeval()関数の戻り値と変数環境の使用例を詳しく解説

伊谢尔伦
伊谢尔伦オリジナル
2017-07-25 14:18:378477ブラウズ

eval() の使用法

次の 2 つの理由により、本当に必要な場合を除き、コード内で eval() ステートメントを使用することは避けるようにしてください。 論理的に言えば、文字列は次の目的で使用する必要があります。プログラム実行の保存 プロセス内のコンテンツと情報は、特定の計算ロジックを保存するために使用されるべきではありません。

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 returns the result of last expression/statement
console.log(eval("null.toString()"));//TypeError, exception in eval-ed code will be propagated outside eval().

変数環境

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

//variable environment
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() 関数に渡すことはできません:

function test(){
  var s = "test";
  eval("return s;");
}
test();//SyntaxError: return not in function

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

//local variable environment and global variable environment
var renamed = eval;
var x = "origin", y = "origin";
function f(){
  var x = "new";
  eval("x += 'Changed';");
  return x;
}
function g(){
  var y = "new";
  renamed("y += 'Changed';");
  return y;
}
console.log(f(), x);//newChanged origin
console.log(g(), y);//new originChanged

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

以上がJavaScriptでのeval()関数の戻り値と変数環境の使用例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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