자바 스크립트 실행 컨텍스트 및 실행 스택

실행 컨텍스트는 무엇입니까?

실행 컨텍스트는 구문 분석 현재의 코드와 당신이 수행하는 환경입니다.

  • Global code: 기본 실행 환경, 코드 어디 제 1 실행 환경
  • Function code: 기능 실행 환경의 본문을 입력 할 때
  • Eval code: 코드 조각이 전달하면 eval함수가 실행되는 환경
    그림 삽입 설명 여기
    보라색 상자 패키지 글로벌 컨텍스트 person, firstName3lastName 기능 컨텍스트가 전체 코드는 국제적인 맥락이다, 그것은 세 가지 다른 상황에 액세스 할 수 있습니다.

실행 컨텍스트 스택

JS 파서 브라우저는 단 한 가지 한 번 (코드 실행의 한 줄을) 무슨 일이 있었 즉, 단일 스레드이며, 운영 및 이벤트 실행 스택은 안쪽으로 누르면
그림 삽입 설명 여기
브라우저가 처음로드 스크립트가 글로벌 기본값을 입력 할 때 전역 코드에서 함수를 호출하는 경우 실행 컨텍스트는 다음 프로그램의 흐름은 함수의 본문을 입력하는 기능의 실행 컨텍스트를 생성하고,이 컨텍스트는 스택 실행의 상단 될 것 것
것 현재 함수 내에서 다른 함수를 호출 할 경우, 동일한 프로세스 문맥은 스택의 상단 동안 누르면, 함수 본문에 프로그램 흐름은 새로운 실행 컨텍스트를 생성하고, 발생한다. 브라우저는 항상 다음 층의 콘텍스트 함수가 실행될 때, 스택은 문맥으로부터 제거 스택의 상단에 위치 컨텍스트 및 프로그램 제어 복귀를 실행한다.

 (function foo(i) {
    if (i === 3) {
        return;
    } else {
        foo(++i);
    }
})(0);

실행 스택에 변경

그림 삽입 설명 여기
위의 코드는 자신을 세 번, 모든 변수 더하기 하나를 호출합니다. 마다 함수 foo호출은 새로운 실행 컨텍스트가 생성된다. 실행이 완료되면, 그것은 스택에서 제거되고, 글로벌 맥락 때까지, 다음 단계의 실행 컨텍스트에만 스택을 반환합니다.

실행 컨텍스트 키 포인트

  • JS는 단일 스레드의 실행 코드 인
  • 스택의 코드 실행을 실행 동기화됩니다
  • 하나의 국제적인 맥락이있다
  • 기능 컨텍스트의 무제한있을 수 있습니다
  • 각 함수 호출은 모두 실행 컨텍스트를 만드는 함수는 너무 너무 자신을 호출

철저한 실행 컨텍스트

각 함수 호출은 실행 컨텍스트를 만듭니다. JS 파서에서, 때마다 당신은 함수 컨텍스트는 두 단계를 거치게됩니다 만들 수 있습니다.
무대 만들기 (1)

  • 범위 체인 만들기
  • 내부 기능 변수, 함수 및 파라미터 만들기
  • this복제

2 코드 실행 스테이지

  • 변수, 함수 참조 코드 실행을 할당
executionContextObj = {
    'scopeChain': { ... },
    'variableObject': { ... },
    'this': {}
}

1. scopeChain :있어서 variableObject, 외층 모두 컨텍스트 변수
2. variableObject : 함수 함수의 매개 변수를 포함하고 내부 문

변수 객체 (변수 객체)

코드 내의 함수가 실행되기 전에 함수 호출되면, 그것은 문맥 객체 실행 작성 executionContextObj생성 단계 : 이것은 우리가 JS 파서 부르는의 첫 단계이다. 특히, 파서 생성 executionContentObj변수 선언 및 함수 선언 통과 파라미터뿐만 아니라, 내부의 기능을 제 스캔 기능을한다라고 이러한 매개 변수 및 속성은 실행 콘텍스트 객체로서 선언variableObject

자세한 과정

하나의 함수를 발견 신체의 함수 호출
2 함수 본문을 실행하기 전에, 콘텍스트 객체가 실행 만들
생성 단계로 3

  • 초기화 범위 체인 (scopeChain)

  • 변수 객체를 생성

    • 매개 변수 개체 (인수 객체), 시험 매개 변수의 컨텍스트 초기화 파라미터의 이름과 값을 만듭니다
    • 컨텍스트 스캔 함수 선언
      • 각 함수 선언의 경우, 것이다 variableObject속성, 함수 이름이라는 속성을 만들고, 객체 참조는 메모리의 기능을 변경하는 포인트
      • 함수가 이미 존재하는 경우, variableObject값은 다시 작성됩니다
    • 변수 선언 스캔 컨텍스트
      • 각 변수 선언의 경우, 모든 것 variableObject속성의 값이 초기화되는 동안, 속성, 변수 이름을 명명 된 속성을 만들undefined
      • 속성이 선언 된 경우, 아무것도하지 않고, 건너 뛰기
    • 클리어 컨텍스트 this

4. 실행 코드

  • 순차적 변수 값을 부여하고,이 문맥, 실행 코드에서, 코드 라인을 수행
function foo(i) {
    var a = 'hello';
    var b = function privateB() {};
    function c() {}
}

foo(22);

호출시 foo(22), 실행 컨텍스트 개체 생성 단계

fooExecutionContext = {
    scopeChain: { ... },
    variableObject: {
        arguments: {
            0: 22,
            length: 1
        },
        i: 22,
        c: pointer to function c()
        a: undefined,
        b: undefined
    },
    this: { ... }
}

도시 된 경우, 값은 (함수 인수 제외) 변수의 정의를 선언 만, 상기 생성 단계에서 자신에게 할당되지 않는다. 위상 함수가 생성되면, 실행 코드로 프로그램 흐름은 기능의 실행, 실행 콘텍스트 객체를 완료fooExecutionContext

fooExecutionContext = {
    scopeChain: { ... },
    variableObject: {
        arguments: {
            0: 22,
            length: 1
        },
        i: 22,
        c: pointer to function c()
        a: 'hello',
        b: pointer to function privateB()
    },
    this: { ... }
}

명명 업그레이드

변수 선언과 기능 영역 위에 언급 된 함수 내 함수 선언 : 리프팅 수단 명명

(function() {

    console.log(typeof foo); // function pointer
    console.log(typeof bar); // undefined

    var foo = 'hello',
        bar = function() {
            return 'world';
        };

    function foo() {
        return 'hello';
    }

}());

의 질문과 답변의 형식의 이름을 향상시키기 위해 보내는 과정을 알아 보자
왜 수 있습니다 1. foo이전 문에 대한 액세스를?

  • 생성 단계에서, 모든 변수는 함수가 실행될 때, 변수는, 생성 된 foo가변 객체의 문맥에서 정의되고

2. foo두 번 선언, 왜 foo지시되는 function대신 undefinedstring?

  • 에도 불구하고 foo문을 두 번,하지만 당신은 무대를 만들 때, 함수 선언이 선행 될 변수는 컨텍스트 객체에 정의되어
  • 따라서, 포인트 function foo()참조가 처음 생성 한 다음, 인터프리터를 스캔 할 때 var foo, 보았다 속성 이름이 foo존재, 아무것도 할 수없는 것, 건너 뛰기

3. 왜이다 bar의 유형 undefined?

  • bar생성 위상 변수 값, 포인터 변수 함수식은 초기화된다undefined

원래 링크 http://davidshariff.com/blog/what-is-the-execution-context-in-javascript/#first-article

게시 17 개 원래 기사 · 원의 칭찬 0 · 조회수 (404)

추천

출처blog.csdn.net/k19970320j/article/details/104377890