소스 코드에서 문자열을 동적으로 결정하는 것은 실제로 적용할 필요가 거의 없는 매우 강력한 언어 기능입니다. eval()을 사용하는 경우 실제로 사용해야 하는지 신중하게 고려해야 합니다.
1. eval()은 함수인가요 아니면 연산자인가요?
eval()은 함수이지만 연산자로 취급되었기 때문입니다. . 초기 버전의 JavaScript 언어는 eval 함수를 정의했으며 최신 JavaScript 인터프리터는 광범위한 코드 분석 및 최적화를 수행합니다. eval의 문제는 일반적으로 동적 실행에 사용되는 코드를 분석할 수 없다는 것입니다. 즉, 함수가 eval을 호출하면 인터프리터가 함수를 더 이상 최적화할 수 없고 eval을 함수의 다른 부분으로 정의할 수 없다는 것입니다. 다른 이름(var f=eval;)을 지정할 수 있으면 인터프리터는 f()를 호출하는 함수를 안전하게 최적화할 수 없습니다. eval이 연산자이면 이러한 문제를 피할 수 있습니다.
2.eval()
eval()에는 매개변수가 하나만 있습니다. 전달된 매개변수가 문자열이 아닌 경우 이 함수를 직접 반환합니다. 매개변수가 문자열인 경우 문자열을 JavaScript 코드로 컴파일하고 컴파일에 실패하면 구문 오류 예외가 발생합니다. 컴파일이 성공하면 이 코드 조각이 실행되고 문자열의 마지막 표현식이나 명령문의 값이 반환됩니다. 마지막 표현식이나 명령문에 값이 없으면 결국 undefound가 반환됩니다. 문자열에서 예외가 발생하면 이 예외는 호출을 eval()에 전달합니다.
eval에서 가장 중요한 점은 호출되는 가변 범위 환경을 사용한다는 것입니다. 즉, 변수의 값을 조회하고 로컬 범위의 코드와 완전히 동일하게 새로운 변수와 함수를 정의합니다. 함수가 지역 변수 x를 정의한 다음 eval("x")를 호출하면 지역 변수의 값을 반환합니다. eval("x=1")을 호출하면 지역 변수의 값이 변경됩니다. 함수가 eval("var y=2;")을 호출하면 새 지역 변수 y를 선언합니다. 마찬가지로 함수는 다음 코드를 통해 지역 변수를 선언할 수 있습니다.
eval("function f(){return x+ 1;}”);
최상위 코드에서 eval이 호출되면 물론 전역 변수와 전역 함수에 대해 작동합니다.
eval에 전달된 문자열은 문법적으로 일관성이 있어야 합니다. eval을 통해 함수에 임의의 코드 조각을 붙여 넣을 수 없습니다. 예를 들어 eval("return;")은 의미가 없습니다. 왜냐하면 return은 It일 때만 사용할 수 있기 때문입니다. 함수 내에서만 작동하며 실제로 eval 문자열이 실행될 때의 컨텍스트는 함수가 호출되는 컨텍스트와 동일하므로 함수의 일부로 실행될 수 없습니다. 문자열이 별도의 스크립트로 의미가 있는 경우 이를 매개변수로 eval에 전달하는 데 문제가 없습니다. 그렇지 않으면 eval에서 구문 오류 예외가 발생합니다.
3. 전역 eval()
eval()에는 레이아웃 변수를 변경하는 기능이 있는데 이는 JavaScript 최적화 프로그램에 큰 문제입니다. 그러나 임시방편으로 JavaScript 인터프리터는 eval을 호출하는 함수에 대해 많은 최적화를 수행하지 않습니다. 하지만 스크립트가 eval에 대한 별칭을 정의하고 이를 다른 이름으로 호출할 때 JavaScript 인터프리터는 어떻게 작동합니까? JavaScript 인터프리터 구현을 단순화하기 위해 ECMAScript3 표준에서는 인터프리터가 eval에 별칭을 할당할 수 없도록 규정하고 있습니다. eval 함수가 별칭을 통해 호출되면 EavlError 예외가 발생합니다.
실제로 대부분의 구현에서는 이렇게 하지 않습니다. 별칭을 통해 호출되면 eval은 해당 문자열을 최상위 전역 코드로 실행합니다. 실행된 코드는 새로운 전역 변수와 전역 함수를 정의하거나 전역 변수에 값을 할당할 수 있지만 호출 함수에서 지역 변수를 사용하거나 수정할 수는 없습니다. 따라서 이는 함수 내의 코드 최적화에 영향을 미치지 않습니다.
ECMAScript 5는 EavlError 사용에 반대하며 eval의 동작, 즉 "direct eval"을 표준화합니다. 이는 정규화되지 않은 "eval" 이름을 사용하여 eval() 함수가 직접 호출될 때 일반적으로 "direct eval"이라고 합니다. eval()이 직접 호출되면 항상 호출된 컨텍스트 범위 내에서 실행됩니다. 기타 간접 호출은 전역 개체를 컨텍스트 범위로 사용하며 지역 변수 및 함수를 읽거나 쓰거나 정의할 수 없습니다. 다음은 샘플 코드입니다.
var geval=eval; //使用别名调用evla将是全局eval var x="global",y="global"; //两个全局变量 function f(){ //函数内执行的是局部eval var x="local"; //定义局部变量 eval("x += ' chenged';");//直接使用eval改变的局部变量的值 return x; //返回更改后的局部变量 } Function g(){ //这个函数内执行了全局eval var y="local"; geval("y += ' changed';"); //直接调用改变了全局变量的值 return y; } console.log(f(),x); //改变了布局变了,输出 “local changed global” console.log(g(),y); //改变了全局变量,输出 “local global changed”
전역 평가의 이러한 동작은 코드 최적화 필요성에 대한 타협일 뿐만 아니라 실제로 이러한 작업을 수행할 수 있는 매우 유용한 기능입니다. 컨텍스트는 글로벌 스크립트 섹션. 코드 세그먼트를 실행하는 데 실제로 eval이 필요한 시나리오는 거의 없습니다. 그러나 실제로 그 필요성을 깨닫게 되면 로컬 평가 대신 전역 평가를 사용할 가능성이 더 높습니다.
4. 엄격한 평가()
ECMAScript5 엄격 모드는 eval() 함수의 동작은 물론 식별자 eval의 사용에도 더 많은 제한을 적용합니다. eval이 strict 모드에서 호출되거나 eval에 의해 실행되는 코드 세그먼트가 "Use strict" 지시문으로 시작하는 경우 여기서 eval은 비공개 컨텍스트의 로컬 eval입니다. 즉, 엄격 모드에서 eval에 의해 실행되는 코드 세그먼트는 지역 변수를 쿼리하거나 변경할 수 있지만 지역 범위에서 새 변수나 함수를 정의할 수는 없습니다.
또한 엄격 모드에서는 "eval"을 예약어로 나열하므로 eval()이 연산자에 더 가깝습니다. eval() 함수는 별칭으로 재정의될 수 없습니다. 그리고 변수 이름, 함수 이름. 함수 매개변수나 예외 캡처 매개변수 모두 eval이라는 이름을 지정할 수 없습니다.
위 내용은 JavaScript에서 전역 함수 eval()을 사용하는 방법에 대한 자세한 코드 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!