JavaScript에서는 eval () 함수를 사용하여 문자열에서 JavaScript 코드를 구문 분석하고 해당 코드 실행 결과를 반환 할 수 있습니다.
코드 사본은 다음과 같습니다.
Console.log (Eval ( "42 * 2")); // 84
Eval ()는 본질적으로 JavaScript 글로벌 객체의 함수입니다. 예를 들어, 위의 코드는 다음과 같습니다.
코드 사본은 다음과 같습니다.
Console.log (this.eval ( "42 * 2")); // 84
그러나 eval () 문을 사용할 때 위에서 언급 한 첫 번째 방법은 일반적으로 채택됩니다. 즉, 글로벌 객체를 무시하고 eval ()을 직접 사용합니다.
eval () 사용
다음 두 가지 이유로, 실제로 필요하지 않은 한, 코드에서 eval () 문을 사용하지 않도록 노력해야합니다.
1. 논리적으로 말하면, 문자열은 특정 계산 로직을 저장하기보다는 프로그램 작동 중 컨텐츠와 정보를 저장하는 데 사용해야합니다.
2. eval () 매개 변수는 문자열이므로 문자열에 대해 어휘가 될 수 없으므로 JavaScript 통역사는 Eval () 호출 문에 대해 최적화 할 수 없습니다.
eval ()의 반환 값
Eval ()의 반환 값은 다음 규칙을 따릅니다.
1. eval ()의 매개 변수가 문자열이 아닌 경우, valit ()는 매개 변수를 직접 반환합니다.
2. eval ()의 매개 변수가 문자열 인 경우 eval ()는 문자열을 코드로 구문 분석하고 실행하고 마지막 코드 실행 결과를 반환합니다.
3. 문자열을 합법적 인 코드로 구문 분석 할 수없는 경우 eval ()은 구문 오류 오류를 던집니다.
4. 문자열을 법적 코드로 구문 분석 할 수 있지만이 코드를 실행하는 동안 오류가보고되면 Eval () 문에 오류가보고되고 Eval ()에 의해 던져집니다.
코드 사본은 다음과 같습니다.
Console.log (Eval ([1,2,3])); // [1, 2, 3]
console.log (typeof eval ([1,2,3])); // 객체
Console.log (Eval ( "42 */2")); // syntaxerror
Console.log (Eval ( "42 * 2; 22 * 3;"); // 66. 평가는 마지막 표현/문의 결과를 반환합니다
console.log (eval ( "null.toString ()"); // typeError, 평가 코드의 예외는 Eval () 외부에서 전파됩니다.
가변 환경
JavaScript의 Eval ()에는 중요한 기능이 있습니다. Eval () 매개 변수 문자열의 코드는 외부 코드의 변수에 액세스 할 수 있으며 매개 변수 문자열 코드의 새로 생성 된 변수를 외부 코드에 노출시킬 수도 있습니다. 즉, Eval () 매개 변수 문자열을 법적으로 구문 분석 할 수 있다면 JS는 Parsed Code를 Eval ()가있는 줄로 바꿉니다.
코드 사본은 다음과 같습니다.
// 가변 환경
var a = 108;
console.log (Eval ( "함수 double (x) {return x*2;} a = double (a)");
Console.log (a); // 216
Console.log (Double (33)); // 66
위의 기능을 구현하기위한 전제 조건은 Eval () 매개 변수 문자열의 코드를 법적으로 구문 분석 할 수 있다는 것입니다. JS는 올바른 코드 구문 외에도 eval () 매개 변수 문자열의 코드가 "자체 조직화"해야합니다. 코드는 매개 변수 문자열의 코드 측면에서만 이해되어야합니다. 예를 들어, "return"과 같은 문자열을 전달하는 것은 불가능합니다. 평가 () 함수 :
코드 사본은 다음과 같습니다.
기능 test () {
var s = "테스트";
평가 ( "return s;");
}
test (); // syntaxerror : 기능이 아닌 반환
eval () 함수를 직접 사용하는 경우 eval () 매개 변수 문자열의 코드에 의해 액세스하는 변수는 Eval () 문이 위치한 함수의 변수, 즉 Eval () 함수가 사용하는 변수 환경이 "로컬 변수 환경"입니다. Eval () 함수를 직접 사용하지 않지만 Eval () 함수를 가리키는 새 변수를 사용하는 경우 해당 매개 변수 문자열에서 코드가 액세스하는 변수는 글로벌 변수, 즉 Eval () 함수가 사용하는 변수 환경은 "글로벌 변수 환경"입니다.
코드 사본은 다음과 같습니다.
// 로컬 가변 환경 및 글로벌 변수 환경
var Renamed = Eval;
var x = "원산지", y = "원산지";
함수 f () {
var x = "new";
평가 ( "x += '변경';");
반환 x;
}
함수 g () {
var y = "New";
이름이 바뀌 었습니다 ( "y += '변경';");
반품 Y;
}
Console.log (f (), x); // newChanged Origin
Console.log (g (), y); // 새로운 원점이 있습니다
그러나 IE6, 7 및 8의 행동이 다르다는 점은 주목할 가치가 있습니다. eval () 함수의 이름이 바뀌더라도 IE6, 7 및 8에서 "로컬 변수 환경"이 여전히 사용됩니다.