2013-07-21 4 views
6

자바 스크립트가 별칭 평가를 허용합니까? 다음 코드의 첫 번째 부분은 예기치 않게 작동하지만 (1,1은 표시되지만) 두 번째 부분은 표시되지 않습니다 (1, 2 표시). ECMA 스크립트 또는 mozilla 문서에 대한 참조가 유용 할 수 있습니다. 찾을 수 없습니다.자바 스크립트 평가 별칭

<html> 
<script type="application/javascript;version=1.8"> 
    (function(){ 
     eval('var testVar=1'); 
     alert(testVar); 
     var eval2=eval; 
     eval2('var testVar=2'); 
     alert(testVar); 
    })(); 

    (function(){ 
     eval('var testVar=1'); 
     alert(testVar); 
     eval('var testVar=2'); 
     alert(testVar); 
    })(); 
</script> 
</html> 
+1

첫 번째 결과는 어떻게 예기치 않게 발생합니까? –

+0

'eval'에 앨리어스가 없으면 1, 2를 표시하고 두 번째 함수를 봅니다. 예상되는 경우 질문에 대답 할 수 있습니까? 감사. – simonzack

+0

네,하지만 1과 2를 표시하면 예상치 않게 첫 번째 동작이 일어난다 고 했지요. 예상대로입니다. –

답변

7

"별칭"eval을 "별칭"으로 지정할 수 없으며 동일한 동작을 할 수 없습니다. 그처럼 간단합니다. 왜? eval은 기능이 아닙니다.

eval2을 호출 할 때 변수 "cache"가 전역 변수와 함께 작동하도록 설정하고 있습니다. 따라서 변수를 내부에 설정하면 전역 변수를 설정하게됩니다. 그러나 종료 할 때 변수 "cache"는 범위가 지정된 함수로 돌아갑니다. 이것이 두 번째 alert이 1을 나타내는 이유입니다. 전역 변수는 함수 수준 1에 의해 음영 처리됩니다.

은 부록 E ECMAScript를 (강조 내)의 (239)

10.4.2에 유의한다 : 버전 5에서는, 평가 함수에 간접 호출로 지구 환경을 사용하여 두 변수 환경과 eval 코드를위한 어휘 환경. Edition 3에서는 eval code의 환경으로서 간접 eval 호출자의 변수와 어휘 환경이 사용되었습니다.

더 호출 컨텍스트 또는 가없는 경우 평가 코드가 아닌 경우 "평가 코드를 입력"의 전체 정의는 §10.5.2 (58 페이지) (강조 광산)

  1. 에 정의되어

그것은 인 것처럼, 그 평가 함수를 직접 호출 (15.1.2.1.1)에 의해 평가되는 것이

  • 실행 컨텍스트를 초기화한다 10.4.1.1에 설명 된 바와 같이 C와 같은 평가 코드를 사용하여 글로벌 실행 컨텍스트 . 그렇지
  • ,
    • 는 호출 실행 콘텍스트의 ThisBinding과 동일한 값으로 설정 ThisBinding.
    • LexicalEnvironment를 호출 실행컨텍스트의 LexicalEnvironment와 동일한 값으로 설정합니다.
    • VariableEnvironment를 호출 실행 컨텍스트의 VariableEnvironment와 동일한 값으로 설정하십시오. 평가 후면 코드가 엄격한 코드 인 경우
    • 하자가 NewDeclarativeEnvironment가 인수로 LexicalEnvironment 전달 호출의 결과 strictVarEnv.
    • LexicalEnvironment를 strictVarEnv로 설정하십시오.
    • VariableEnvironment를 strictVarEnv로 설정하십시오.
  • eval 코드를 사용하여 10.5에서 설명한대로 선언 바인딩 바인딩을 수행하십시오.
  • +1

    'eval'이 함수가 아닌데'alert (eval)'이'function eval() {[native code]}'를 표시하는 이유는 무엇입니까? – Teemu

    +0

    첫 번째 부분이 잘못되었습니다. 'eval' 앨리어스가 파이어 폭스에서 작동하고 오류가 발생하지 않지만 예상대로 아닙니다. 'eval2 (alert ("test"))'를 시도하십시오. 실제로 ECMA 사양에서는 "구현시 더 이상 직접 호출이 아닌 방식으로 평가 사용을 제한 할 수 없습니다." – simonzack

    +3

    표준을 잘못 읽고 있습니다. 'eval' *은 에일 리 어스 될 수 있지만 다르게 작동합니다. 표준의 다른 부분을 참고하십시오 : "* 평가 코드는 ** 내장 된 평가 함수 ***에 제공된 소스 텍스트입니다 (* 10.1),"* 또는 평가 코드가 * * 직접 호출 *** "(# 10.4.2) 및 기타. – DCoder

    2

    첫 번째 경우는 eval을 사용할 때 실행되는 함수 범위를 사용합니다. evaleval2에 할당 한 다음 동일한 문을 실행하면 함수 컨텍스트가 아닌 window 컨텍스트 (전역 범위)가 사용 된 것으로 보입니다. 첫 번째 경우에 같은 값 1 참조 왜 함수 내에서 testVar가 1이고 window.testVar 외부 당신은 실행하여이를 증명할 수있는 2이기 때문 '당신이 할 수있는, Mozilla Developer Network에 따라 아래, 사실

    <script> 
    (function(){ 
         eval('var testVar=1'); 
         alert(window.testVar); 
         var eval2=eval; 
    
         eval2('var testVar=2'); 
         alert(window.testVar); 
        })(); 
    
        (function(){ 
         eval('var testVar=1'); 
         alert(testVar); 
         eval('var testVar=2'); 
         alert(testVar); 
        })(); 
    </script> 
    

    을 니펫 t 별칭 평가.

    관련 문제