JavaScriptのeval関数の使用紹介
3027 ワード
JavaScriptでは、eval()関数を使用して文字列中のJavaScriptコードを解析し、該当コードの実行結果を返します.
eval()の使用
以下の2つの理由に基づいて、必要でない限り、コードの中でeval()の文を使用することを避けるべきです.
1.論理的には、文字列は、プログラムの実行中のコンテンツ、情報を格納するために使用されるべきであり、具体的な計算ロジックを格納するために使用されるべきではない.2.eval()パラメータは文字列であるため、文字列については語法ができないため、eval()呼出文に対して、JavaScript解釈器は最適化できません.
eval()の戻り値
eval()の戻り値は、以下の規則に従う.
1.eval()のパラメータが文字列でない場合、eval()は直接パラメータに戻ります.2.eval()のパラメータが文字列である場合、eval()はこの文字列をコードに解析して実行し、最後の行のコードの実行結果を返します.3.文字列が合法的なコードに解析できない場合、eval()はSyntxErrエラーをスローします.4.文字列が合法的なコードとして解析できる場合、このコードを実行する過程でエラーが発生した場合、このエラーはエヴァ()文に報告され、エヴァ()から投げられます.
JavaScriptのeval()には重要な特性があります.eval()パラメータ文字列のコードは外部コードの変数にアクセスできます.パラメータ文字列コードに新規作成された変数を外部コードに暴露することもできます.つまり、eval()パラメータ文字列が合法的に解析されると、JSは解析後のコードをeval()のある行に置き換えます.
console.log(eval("42 * 2"));//84
本質的には、eval()はJavaScriptグローバルオブジェクトの関数です.例えば、上記のコードは以下の通りです.
console.log(this.eval("42 * 2"));//84
ただし、eval()文を使用する場合は、上記の第一の方法、つまりグローバルオブジェクトを無視して直接eval()を使用することが一般的である.eval()の使用
以下の2つの理由に基づいて、必要でない限り、コードの中でeval()の文を使用することを避けるべきです.
1.論理的には、文字列は、プログラムの実行中のコンテンツ、情報を格納するために使用されるべきであり、具体的な計算ロジックを格納するために使用されるべきではない.2.eval()パラメータは文字列であるため、文字列については語法ができないため、eval()呼出文に対して、JavaScript解釈器は最適化できません.
eval()の戻り値
eval()の戻り値は、以下の規則に従う.
1.eval()のパラメータが文字列でない場合、eval()は直接パラメータに戻ります.2.eval()のパラメータが文字列である場合、eval()はこの文字列をコードに解析して実行し、最後の行のコードの実行結果を返します.3.文字列が合法的なコードに解析できない場合、eval()はSyntxErrエラーをスローします.4.文字列が合法的なコードとして解析できる場合、このコードを実行する過程でエラーが発生した場合、このエラーはエヴァ()文に報告され、エヴァ()から投げられます.
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().
変数環境(variable environment)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()文があるfunctionの変数、つまりevval()関数が使用する変数環境は「ローカル変数環境」です.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
ただし、注意すべきことは、IE 6、7、8の行動がこれと異なることである.IE 6、7、8では、eval()関数が名前を変更されても、使用されるのは依然として「ローカル変数環境」である.