문제

ECMA-262 5.1 하위 섹션 10.4.2 그리고 10.4.2.1 "호출 컨텍스트"를 참조합니다. 이것은 문서의 다른 곳에서는 설명되지 않은 것 같습니다.

사양을 인용하고 강조합니다.

10.4.2 평가 코드 입력

제어가 평가 코드의 실행 컨텍스트에 들어갈 때 다음 단계가 수행됩니다.

  1. 없는 경우 호출 컨텍스트 또는 평가 코드가 평가 함수에 대한 직접 호출(15.1.2.1.1)에 의해 평가되지 않는 경우,

10.4.2.1 엄격 모드 제한

평가 코드는 변수 환경에서 변수 또는 함수 바인딩을 인스턴스화할 수 없습니다. 호출 컨텍스트 다음 중 하나의 코드가 있는 경우 eval을 호출했습니다. 호출 컨텍스트 또는 평가 코드가 엄격한 코드입니다.대신 이러한 바인딩은 평가 코드에만 액세스할 수 있는 새로운 VariableEnvironment에서 인스턴스화됩니다.

  • 이 단락에서 "호출 컨텍스트"는 무엇을 의미합니까?나는 그것이 다음을 언급한다고 가정합니다. 실행 컨텍스트 직전에 스택의 맨 위에 eval 라고;누구든지 이것을 확인할 수 있습니까?

  • "부름 컨텍스트 없음"이라는 것은 무엇을 의미합니까? 누군가가 호출을 초래할 수있는 코드 또는 조건의 예를 제공 할 수 있습니까? eval 호출 컨텍스트가 없나요?

도움이 되었습니까?

해결책

"호출 컨텍스트"는 네이티브가 호출하는 컨텍스트를 나타냅니다. eval 함수가 호출되고 있습니다.

실행하고 있는 경우 eval 일부 네이티브 코드에서(예를 들어 다음을 사용하여 완료되면 코드를 실행하는 네이티브 함수를 실행합니다. eval 어떤 이유로든) 컨텍스트가 없으며 전역 범위에서 실행되도록 지정됩니다.컨텍스트는 ECMAScript 실행 코드만 참조합니다.

그러나 호출 컨텍스트는 호출되는 실행 컨텍스트의 변수 및 지시문을 참조합니다.예를 들어 호출 컨텍스트를 확인하는 경우 eval이 엄격한 코드로 작동한다는 것만 알 수 있습니다.

이는 ES-Discuss 메일링 리스트의 매우 유사한 질문으로 명확해졌습니다. 브렌든 아이크 (JavaScript 창시자)는 다음과 같이 응답합니다.

평가 코드에 호출 컨텍스트가 없을 수 있는 방법은 무엇입니까?

ES3은 다음과 같이 말합니다.

10.2.2 평가 코드

컨트롤이 다음에 대한 실행 컨텍스트에 들어갈 때 eval 코드, 이전 활성 실행 컨텍스트, 호출 컨텍스트는 범위 체인인 변수를 결정하는 데 사용됩니다. object 및 this 값입니다.호출 컨텍스트가 없는 경우 범위 체인 초기화, 변수 인스턴스화 및 이 값의 결정은 전역 코드와 마찬가지로 수행됩니다.

"호출 컨텍스트가 없는 경우"에 당황합니다.어떻게 가능성이 발생합니까?어떻게 될까요? eval 아무도 부르지 않으면 전화를 받나요?

응답:

네이티브 코드인 "호스트" 프로그램에서의 호출입니다.

일부 브라우저는 간접 지원 eval, 다음을 허용합니다.

setTimeout(eval, 0, "alert('hi mom')");

사용된 창은 다음과 같습니다. setTimeout 를 따라 발견되었습니다. 스코프 체인이므로

myFrame.setTimeout(eval, 0, "alert(x)");

보여줘야 한다 myFrame.x, 호출 프레임이나 창이 아님 x.

메모: myFrame 이 경우 프레임의 전역 범위를 나타냅니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top