javascript eval 함수 깊이 인식

3519 단어 자바 scripteval
(1)자바 script 의 eval 함수 용법(2)함수 내 에서 전역 코드 를 어떻게 실행 하 는 지 소개 합 니 다►먼저 eval 의 용법 을 말 합 니 다.내용 이 간단 하고 익숙 한 것 은 건 너 뛸 수 있 습 니 다.eval 함 수 는 인자 s 를 받 습 니 다.s 가 문자열 이 아니라면 s 를 직접 되 돌려 줍 니 다.그렇지 않 으 면 s 문 구 를 실행 합 니 다.s 구문 실행 결과 가 값 이 라면 이 값 을 되 돌려 줍 니 다.그렇지 않 으 면 undefined 로 돌아 갑 니 다.특히 주의해 야 할 것 은 대상 성명 문법 인'{}'은 값 을 되 돌려 줄 수 없습니다.괄호 로 묶 어야 값 을 되 돌려 줍 니 다.간단 한 예 는 다음 과 같 습 니 다.var code 1='a'+2';/표현 식 var code 2='{a:2}';/구문 alert(eval(code 1);/->'a2' alert(eval(code2)); //->undefined alert(eval('(' + code2 + ')')); //->[object Object]대상 성명 문 에 있어 서 실행 일 뿐 값 을 되 돌려 줄 수 없습니다.자주 사용 하 는"{}"과 같은 대상 성명 문 구 를 되 돌리 기 위해 서 는 괄호 로 묶 어야 표현 식 으로 변환 할 수 있 습 니 다.JSON 을 이용 한 아 약 스 개발 의 기본 원리 중 하나 이기 도 하 다.예 를 들 어 두 번 째 alert 문 구 는 undefined 를 출력 하고 세 번 째 는 괄호 를 넣 은 후에 출력 하 는 것 은 문 구 를 나타 내 는 대상 이다.►현재 본문의 중점 은 함수 내 에서 전역 코드 를 어떻게 실행 하 는 지 입 니 다.이 문 제 를 설명 하기 위해 서 먼저 예 를 들 어 var s='global';/전역 변수 function demo 1(){eval(var s="local")을 정의 합 니 다.}demo1(); alert(s); //->global 잘 이해 합 니 다.위의 demo 1 함 수 는 function demo 1(){var s='local';}과 같 습 니 다.그 중에서 국부 변수 s 를 정의 했다.그래서 마지막 출력 은 global 입 니 다.이상 한 일이 아 닙 니 다.국부 변수 와 전역 변 수 를 잘 구분 할 수 있 기 때 문 입 니 다.자세히 살 펴 보면 eval 함수 의 특징 을 발견 할 수 있 습 니 다.이 는 항상 컨 텍스트 변수 공간(가방,closure 라 고도 함)에서 실 행 됩 니 다.변수 정의 든 함수 정의 든 모두 이와 같 기 때문에 다음 코드 는 함수 가 정의 되 지 않 은 오류 가 발생 할 수 있 습 니 다.var s='function test(){return 1;}';/함수 정의 문 function demo 2(){eval(s);}demo2(); alert(test()); //->error:test is not defined 이것 은 test 함수 가 부분 공간 에서 정의 되 기 때 문 입 니 다.demo 2 함수 에서 접근 할 수 있 고 밖 에 접근 할 수 없습니다.실제 Ajax 개발 에 서 는 서버 에서 코드 를 동적 으로 가 져 와 서 실행 해 야 할 때 가 있 습 니 다.코드 를 너무 많이 불 러 오 는 문 제 를 줄 이거 나 일부 코드 는 자바 script 자체 로 생 성 되 었 습 니 다.eval 함수 로 실행 하 기 를 바 랍 니 다.그러나 이러한 동적 코드 획득 작업 은 일반적으로 함수 내 에서 이 루어 집 니 다.예 를 들 어 function loadCode(){var code=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(code)방법 을 호출 할 수 있 습 니 다.하나의 예 는 다음 과 같 습 니 다.var s='global'입 니 다.function demo3(){ X2.Eval('var s="local"'); } demo3(); alert(s); //->'local'을 통 해 demo 3 함수 에서 전역 변수 s='local'을 다시 정의 한 것 을 알 수 있 습 니 다.주의해 야 할 것 은 X2.Eval 이 값 을 되 돌려 주지 않 습 니 다.표현 식 의 값 을 구 하려 면 시스템 의 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 중 어느 것 이 옳 고 어느 것 이 그 른 지 는 말 하기 어렵 습 니 다.여러분 은 해결 방법 을 알 면 됩 니 다.

좋은 웹페이지 즐겨찾기