>웹 프론트엔드 >JS 튜토리얼 >JavaScript에서 eval 사용에 대한 자세한 설명

JavaScript에서 eval 사용에 대한 자세한 설명

黄舟
黄舟원래의
2017-11-23 11:00:081997검색

우리의 일상적인 개발 작업에서 많은 친구들이 JavaScript에서 eval을 사용하는 것에 익숙하다고 생각하지만, JavaScript를 처음 접하는 사람들에게는 eval의 사용법이 조금 낯설습니다. 오늘은 자세히 보여드리겠습니다. JavaScript에서 eval 사용에 대한 설명!

eval 함수는 매개변수 s를 받습니다. s가 string이 아니면 s를 직접 반환합니다. 그렇지 않으면 s 문을 실행합니다. s 문의 실행 결과가 값이면 이 값을 반환하고, 그렇지 않으면 정의되지 않은 값을 반환합니다.
객체 선언 구문 "{}"은 값을 반환할 수 없다는 점에 유의해야 합니다. 값을 반환하려면 괄호로 묶어야 합니다.

코드는 다음과 같습니다.

var code1='"a" + 2'; //表达式 
varcode2='{a:2}'; //语句 
alert(eval(code1)); //->'a2' 
alert(eval(code2)); //->undefined 
alert(eval('(' + code2 + ')')); //->[object Object]

보시다시피 객체 선언문의 경우 즉, 실행만 되고 값을 반환할 수 없습니다. 일반적으로 사용되는 "{}" 객체 선언문을 반환하려면 해당 값을 반환하기 전에 괄호로 묶어 표현식으로 변환해야 합니다. 이는 Ajax 개발에 JSON을 사용하는 기본 원칙 중 하나이기도 합니다. 두 번째 경고 문은 정의되지 않음을 출력하고, 괄호를 추가한 후 세 번째 경고 문은 문이 나타내는 개체를 출력하는 것을 예제에서 명확하게 볼 수 있습니다.
이제 이 글의 초점인 함수 내에서 전역 코드를 실행하는 방법에 대해 이야기해 보겠습니다. 이 문제를 설명하기 위해 먼저 예를 살펴보겠습니다.

코드는 다음과 같습니다.

var s='global'; //定义一个全局变量 
function demo1(){ 
eval('var s="local"'); 
} 
demo1(); 
alert(s); //->global

이해하기 쉽습니다. 위의 데모1 함수는 function deco1(){var s='local';}과 동일합니다. , 지역 변수 s를 정의합니다.
그러므로 최종 출력이 전역 변수라는 것은 놀라운 일이 아닙니다. 결국 모든 사람이 지역 변수와 전역 변수를 명확하게 구분할 수 있습니다.
자세히 경험해 보면 eval 함수의 특징을 알 수 있습니다. 이는 변수 정의이든 호출되는 컨텍스트 변수 공간(패키지, 클로저라고도 함)에서 항상 실행됩니다.

코드는 다음과 같습니다.

var s='function test(){return 1;}'; //一个函数定义语句 
function demo2(){ 
eval(s); 
} 
demo2(); 
alert(test()); //->error:test is not defined

테스트 함수는 로컬 공간에 정의되어 있고, 데모2 함수 내에서는 접근이 가능하지만, 접근이 불가능하기 때문입니다. 외부에서 접근 가능.
실제 Ajax 개발에서는 한 번에 너무 많은 코드를 로드하는 문제를 완화하기 위해 실행을 위해 서버에서 동적으로 코드를 얻어야 하거나, 일부 코드가 Javascript 자체에서 생성되어 이를 실행하기 위해 eval 함수를 사용하기를 바랍니다.
그러나 동적으로 코드를 얻는 작업은 일반적으로 함수 내에서 완료됩니다. 예:

코드는 다음과 같습니다.

function loadCode(){ 
varcode=getCode(); 
eval(code); 
}

전역 공간에서는 eval을 실행할 수 없으므로 개발에 많은 문제가 발생함을 알 수 있습니다. 또한 많은 사람들이 이로 인해 우울해졌습니다.
이제 드디어 해결책을 찾았네요 ㅎㅎ IE와 Firefox 모두 호환됩니다.

코드는 다음과 같습니다.

var X2={} //my namespace:) 
X2.Eval=function(code){ 
if(!!(window.attachEvent && !window.opera)){ 
//ie 
execScript(code); 
}else{ 
//not ie 
window.eval(code); 
} 
}

이제 함수 내에서 전역 코드를 정의하려면, X2.eval_r(코드) 메소드를 호출할 수 있으며, 예시는 다음과 같습니다.

코드는 다음과 같습니다.

var s='global'; 
function demo3(){ 
X2.Eval('var s="local"'); 
} 
demo3(); 
alert(s); //->'local'

demo3 함수에서 전역 변수 s="local"이 재정의된 것을 볼 수 있습니다.
X2.Eval은 값을 반환하지 않는다는 점에 유의해야 합니다. 표현식을 평가하려면 시스템의 평가 기능을 사용해야 합니다. X2.Eval은 전역 코드 정의에만 사용되도록 설계되었습니다.
사실 이것을 보고 어떤 사람들은 문제 해결이 너무 쉽다고 느낄 수도 있습니다. 하하. 하지만 이 방법을 찾으려면 약간의 운과 기술이 필요합니다.
(1) IE 브라우저의 경우 이러한 기능은 이미 제공됩니다. 기본값: execScript는 전역 공간에서 코드를 실행하는 데 사용되지만 이에 대해 아는 사람은 많지 않습니다.
(2) Firefox 브라우저의 경우 eval 함수를 직접 호출하면 호출자 공간에서 실행되고, window.eval을 호출하면 전역 공간에서 실행됩니다. 아마 이 사실을 아는 사람은 더 적을 것이다. 결국 Alert(eval==window.eval)은 true를 반환합니다!
Firefox의 eval 함수의 특징은 참으로 이상하지만 그 소스는 JavaScript 사양에서도 찾을 수 있습니다:

If value of the eval property is used in any way other than a direct call (that is, other than by the explicit use of its 
name as an Identifier which is the MemberExpression in a CallExpression), or if the eval property is assigned to, 
an EvalError exception may be thrown.

아마도 eval 함수의 실행이 호출자와 관련되어 있다는 의미일 수 있지만 문제를 말하지는 않습니다. 실행 컨텍스트와 함께. 따라서 IE와 Firefox 중 어느 것이 옳고 그른지 말하기는 어렵습니다. 모두가 해결책을 알고 있다는 것은 좋은 일입니다.

요약:

이 기사에서는 구체적인 예를 통해 JavaScript에서 eval을 사용하는 방법을 보여줍니다. 이 글이 여러분의 작업에 도움이 되기를 바랍니다. !

관련 권장 사항:

JavaScript의 eval() 함수 반환 값 및 변수 환경 사용 예에 ​​대한 자세한 설명

eval()의 역할과 범위에 대한 간략한 설명

JavaScript가 eval() 함수를 사용하여 JavaScript 문자열 인스턴스를 계산하는 방법에 대한 자세한 설명

위 내용은 JavaScript에서 eval 사용에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.