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()callステートメントに最適化できません。
eval()のreturn値
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。評価最後の式/ステートメントの結果を返します
console.log(eval( "null.tostring()")); // typeRror、eval-edコードの例外はeval()の外で伝播されます。
可変環境
JavaScriptには重要な機能があります。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()関数へ:
コードコピーは次のとおりです。
function test(){
var s = "test";
eval( "return s;");
}
test(); // syntaxerror:機能しないでください
eval()関数を直接使用する場合、eval()パラメーター文字列のコードによってアクセスされる変数は、eval()ステートメントが配置されている関数の変数、つまりeval()関数で使用される変数環境は「ローカル変数環境」です。 eval()関数を直接使用しないが、eval()関数を指す新しい変数を使用する場合、対応するパラメーター文字列のコードによってアクセスされる変数はグローバル変数です。つまり、eval()関数で使用される変数環境は「グローバル変数環境」です。
コードコピーは次のとおりです。
//ローカル可変環境とグローバル変数環境
var reneamed = eval;
var x = "origin"、y = "origin";
関数f(){
var x = "new";
eval( "x += 'chander';");
xを返します。
}
関数g(){
var y = "new";
改名( "y += 'chander';");
yを返します。
}
console.log(f()、x); // newChanged Origin
console.log(g()、y); // new OriginChanged
ただし、IE6、7、および8の動作が異なることは注目に値します。 IE6、7、および8では、eval()関数が変更されたとしても、「ローカル変数環境」がまだ使用されています。