JavaScript ECMA-262-3 깊이 분석(1):상하 문 실례 분석 실행
4459 단어 JavaScriptECMA실행 문맥
소개 하 다.
이 글 은 주로 ECMAScript 실행 컨 텍스트 와 관련 된 ECMAScript 실행 가능 코드 를 검토 합 니 다.
정의.
컨트롤 러 가 ECMAScript 실행 가능 코드 로 전 환 될 때마다 실행 컨 텍스트 에 들 어 갑 니 다.
실행 상하 문(약칭-EC)은 추상 적 인 개념 으로 ECMA-262 표준 은 이 개념 과 실행 가능 한 코드(executable code)개념 으로 구분한다.
표준 규범 은 기술 실현 의 측면 에서 EC 의 유형 과 구 조 를 정확하게 정의 하지 않 았 다.이것 은 ECMAScript 엔진 을 구체 적 으로 실현 할 때 고려 해 야 할 문제 일 것 이다.
활성 화 된 실행 컨 텍스트 는 논리 적 으로 스 택 을 구성 합 니 다.스 택 아래쪽 은 항상 전역 컨 텍스트(global context)이 고 스 택 상단 은 현재(활동 적)실행 컨 텍스트 입 니 다.스 택 은 EC 형식의 변수(various kingds of EC)가 밀어 내 거나 팝 업 되 는 동시에 수 정 됩 니 다.
실행 가능 코드
실행 가능 코드 의 개념 과 추상 적 인 실행 문맥 의 개념 은 상대 적 이다.어떤 때 는 실행 가능 한 코드 와 실행 가능 한 문맥 이 등가 이다.
예 를 들 어,우 리 는 상하 문 창 고 를 모 의 실행 할 수 있 는 그룹 을 정의 할 수 있다.
ECStack = [];
함수(함수 가 재 귀적 으로 호출 되 거나 구조 함수 로 사용 되 더 라 도)에 들 어 갈 때마다 내 장 된 eval 함수 가 작업 할 때 이 스 택 은 추 가 됩 니 다.전역 코드
이러한 유형의 코드 는'프로그램'단계 에서 처 리 됩 니 다.예 를 들 어 외부 js 파일 을 불 러 오 거나 로 컬
초기 화(프로그램 시작)단계 에서 ECStack 은 다음 과 같 습 니 다.
ECStack = [
globalContext
];
함수 코드함수 코드(모든 종류의 함수)에 들 어가 면 ECStack 은 새로운 요소 로 추 가 됩 니 다.주의해 야 할 것 은 구체 적 인 함수 코드 는 내부 함수(inner functions)코드 를 포함 하지 않 습 니 다.다음 과 같이 우 리 는 함 수 를 자신의 방식 으로 한 번 재 귀적 으로 합 니 다.
(function foo(bar) {
if (bar) {
return;
}
foo(true);
})();
그러면 ECStack 은 다음 과 같은 방식 으로 변 경 됩 니 다.
// first activation of foo
ECStack = [
<foo> functionContext
globalContext
];
// recursive activation of foo
ECStack = [
<foo> functionContext C recursively
<foo> functionContext
globalContext
];
현재 실행 중인 컨 텍스트 와 ECStack 이 해당 하 는 실행 컨 텍스트 를 꺼 낼 때마다 스 택 포인터 가 자동 으로 위 치 를 이동 합 니 다.이것 은 전형 적 인 스 택 실현 방식 입 니 다.하나 가 던 져 졌 지만 캡 처 되 지 않 은 이상 이 있 습 니 다.하나 이상 의 실행 컨 텍스트 가 있 습 니 다.관련 세그먼트 코드 가 실 행 된 후에 전체 프로그램 이 끝 날 때 까지 ECStack 은 전역 컨 텍스트(global context)만 포함 합 니 다.Eval 코드
eval 코드 가 좀 재미 있어 요.이것 은 상하 문(calling context)을 호출 하 는 개념 이 있 습 니 다.이것 은 eval 함수 가 호출 될 때 발생 하 는 상하 문 입 니 다.eval(변수 나 함수 성명)활동 은 호출 컨 텍스트(calling context)에 영향 을 줄 수 있 습 니 다.
eval('var x = 10');
(function foo() {
eval('var y = 20');
})();
alert(x); // 10
alert(y); // "y" is not defined
ECStack 의 변화 과정:
ECStack = [
globalContext
];
// eval('var x = 10');
ECStack.push(
evalContext,
callingContext: globalContext
);
// eval exited context
ECStack.pop();
// foo funciton call
ECStack.push(<foo> functionContext);
// eval('var y = 20');
ECStack.push(
evalContext,
callingContext: <foo> functionContext
);
// return from eval
ECStack.pop();
// return from foo
ECStack.pop();
보 셨 죠?아주 일반적인 논리 호출 스 택 입 니 다.버 전 번호 1.7 이상 의 SpiderMonkey(Firefox,Thunderbird 에 내장)의 실현 에서 호출 된 컨 텍스트 를 두 번 째 매개 변수 로 eval 에 전달 할 수 있 습 니 다.그러면 이 상하 문 이 존재 한다 면'사유'(private 키워드 로 명 명 된 변수 와 같은)변수 에 영향 을 줄 수 있 습 니 다.
function foo() {
var x = 1;
return function () { alert(x); };
};
var bar = foo();
bar(); // 1
eval('x = 2', bar); // pass context, influence on internal var "x"
bar(); // 2
결론.이 글 의 내용 은 앞으로 실행 문맥 과 관련 된 다른 주제(예 를 들 어 변수 대상,역할 도 메 인 체인 등)를 분석 하 는 최소한 의 이론 적 기반 으로 이런 주 제 는 후속 장 에서 말 할 것 이다.
기타 참고 사항
이 글 의 내용 은 ECMA-262-3 표준 규범 에 대응 하 는 장절 이다.
영어 주소:ECMA-262-3 in detail. Chapter 1. Execution Contexts
관심 있 는 친 구 는 온라인 HTML/CSS/JavaScript 코드 실행 도 구 를 사용 할 수 있 습 니 다.http://tools.jb51.net/code/HtmlJsRun상기 코드 실행 효 과 를 테스트 할 수 있 습 니 다.
더 많은 자 바스 크 립 트 관련 내용 은 본 사이트 의 주 제 를 볼 수 있 습 니 다.
본 고 에서 말 한 것 이 여러분 의 자 바스 크 립 트 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
기초 정리 - 1문자 (String) 숫자 (Number) 불린 (Boolean) null undefined 심볼 (Symbol) 큰정수 (BigInt) 따옴표로 묶어 있어야 함 Not-A-Number - 숫자 데이터 / 숫자로 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.