>  기사  >  웹 프론트엔드  >  JavaScript 시리즈에 대한 심층적인 이해 (11) 실행 컨텍스트_javascript 기술

JavaScript 시리즈에 대한 심층적인 이해 (11) 실행 컨텍스트_javascript 기술

WBOY
WBOY원래의
2016-05-16 17:56:57974검색

소개
이 장부터 ECMAScript 표준 이해에 관한 http://dmitrysoshnikov.com/ 웹사이트의 좋은 기사를 계속(번역, 재인쇄, 정리)하겠습니다.

이 장에서 설명할 내용은 ECMAScript 표준의 실행 컨텍스트와 관련된 다양한 실행 코드에 대한 것입니다.

원저자: Dmitry A. Soshnikov
원본 출시: 2009-06-26
러시아어 원문: http://dmitrysoshnikov.com/ecmascript/ru-chapter-1-execution-contexts /

영어 번역: Dmitry A. Soshnikov.
게시일: 2010-03-11
영어 번역: http://dmitrysoshnikov.com/ecmascript/chapter-1-execution-contexts/

이 글은 블로그 정원 justinw의 중국어 번역을 참고하여 일부 오류를 수정했습니다. 번역자님 덕분입니다.
코드 복사
정의
컨트롤러가 ECMAScript 실행 코드로 전환할 때마다 실행 컨텍스트로 들어갑니다. 실행 컨텍스트(줄여서 -EC)는 ECMA-262 표준의 추상 개념으로, 실행 코드 개념과 구별하는 데 사용됩니다.

표준 사양에는 기술적 구현 관점에서 EC의 정확한 유형과 구조가 정의되어 있지 않습니다. 이는 ECMAScript 엔진을 구체적으로 구현할 때 고려해야 할 문제입니다.

활성 실행 컨텍스트 그룹은 논리적으로 스택을 형성합니다. 스택의 맨 아래는 항상 전역 컨텍스트이고 맨 위는 현재(활성) 실행 컨텍스트입니다. EC 유형이 컨텍스트에 들어오고 나갈 때 스택이 수정(푸시 또는 팝)됩니다.

실행 가능한 코드 유형
실행 가능한 코드 유형의 개념은 실행 컨텍스트라는 추상적인 개념과 관련이 있습니다. 어떤 시점에서는 실행 가능한 코드와 실행 컨텍스트가 동일할 수도 있습니다.

예를 들어, 실행 컨텍스트 스택을 배열로 정의할 수 있습니다.

ECStack = []
함수가 입력될 때마다(함수가 재귀적으로 호출되거나 생성자로) 또는 내장 평가 함수가 작동하면 이 스택이 푸시됩니다.

전역 코드
이러한 유형의 코드는 "프로그램" 수준에서 처리됩니다. 예를 들어 외부 js 파일 또는 로컬 <script></script> 태그 내의 코드를 로드합니다. 전역 코드에는 함수 본문 내의 코드가 포함되지 않습니다.

초기화(프로그램 시작) 단계에서 ECStack은 다음과 같습니다.

코드 복사 코드는 다음과 같습니다. 다음:

ECStack = [
globalContext
];

함수 코드
함수 함수 코드 입력 시(모든 유형의 함수) ECStack 억제됩니다. 새로운 요소를 통합합니다. 특정 기능 코드에는 내부 기능 코드가 포함되지 않는다는 점에 유의해야 합니다. 아래와 같이 함수를 한 번 재귀적으로 조정하도록 합니다.
코드 복사 코드는 다음과 같습니다.

(function foo(bar) {
if (bar) {
return;
}
foo(true);
})()

그러면 ECStack이 다음과 같이 변경됩니다.
코드를 복사합니다. 코드는 다음과 같습니다.

/ / foo의 첫 번째 활성화 호출
ECStack = [
functionContext
globalContext
]// foo
ECStack = [
functionContext – 재귀적으로
functionContext
globalContext
]; 그에 따라 실행 컨텍스트가 종료됩니다. ECStack이 팝업되고 스택 포인터가 자동으로 이동합니다. throw된 예외는 가로채지 않으면 하나 이상의 실행 컨텍스트에서 종료될 수 있습니다. 관련 코드가 실행된 후 ECStack은 전체 애플리케이션이 종료될 때까지 전역 컨텍스트만 포함합니다.

평가 코드
평가 코드가 좀 흥미롭네요. 여기에는 호출 컨텍스트(예: eval 함수가 호출될 때 생성되는 컨텍스트)라는 개념이 있습니다. eval(변수 또는 함수 선언) 활동은 호출 컨텍스트에 영향을 미칩니다.




코드 복사
코드는 다음과 같습니다. eval('var x = 10') ; (function foo() {
eval('var y = 20');
})()

alert(x); >alert( y); // "y" 프롬프트는


ECStack 변경 프로세스를 선언하지 않습니다:



코드 복사

코드는 다음과 같습니다.

ECStack = [
globalContext
];

// eval('var x = 10')
ECStack.push(
evalContext,
callingContext: globalContext
);

// 종료된 컨텍스트
ECStack.pop()

// foo funciton 호출
ECStack.push(
// eval('var y = 20')
ECStack.push(
evalContext,
callingContext:
); 🎜>
// eval에서 반환
ECStack.pop();

// foo에서 반환
ECStack.pop()

매우 일반적인 논리적 호출 스택입니다.

버전 번호 1.7 이상의 SpiderMonkey(내장 Firefox, Thunderbird) 구현에서는 호출 컨텍스트를 두 번째 매개변수로 eval에 전달할 수 있습니다. 글쎄요, 이 컨텍스트가 존재한다면 "개인"(어떤 사람들은 그것을 부르기를 좋아합니다) 변수에 영향을 미칠 수 있습니다.

코드 복사 코드는 다음과 같습니다.
function foo() {
var x = 1 ;
반환 함수() { 경고(x) };

var bar = foo();

eval('x = 2', bar); // 컨텍스트를 전달하면 내부 var x 변수에 영향을 미칩니다.

bar() // 2


결론
이 기사는 실행 컨텍스트와 관련된 다른 주제(예: 변수 객체, 범위 체인 등)에 대한 후속 분석을 위한 최소한의 이론적 기초이며, 이에 대해서는 후속 장에서 논의됩니다.
기타 참고자료
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.