JS 실행 컨텍스트는 무엇인가?

실행 JS 코드의 순서는 항상 머리가 옆으로 비동기 문제는 당신이 심지어 동기 코드를 찾을 수 코드의 순서와 다를 수 있음을 우리 모두는 알고는, 그것의 실행은 또한 다음과 같은 기대와 일치하지 :

함수 F1 () { 
    CONSOLE.LOG ( '바람, 바람 소리' ); 
}; 
F1 (); // 에코 

함수 F1 () { 
    CONSOLE.LOG ( '에코' ); 
}; 
F1 (); // 에코

코드를 기입 순서에 따라, 제 바람을 들어야 출력이 바람되고, 그 후 출력 에코 물고기, 불행히도, 두 개의 출력은 에코 것이며, 우리는 상기 코드 변경 기능을 발현하는 기능을 선언하는 경우 , 그 결과가 동일하지 않다 :

VAR F1 = 함수 () { 
    CONSOLE.LOG ( '바람, 바람 소리' ); 
}; 
F1 (); // 바람 소리가 풍력 인 

var에 F1 = 함수 () { 
    CONSOLE.LOG ( '에코' ); 
}; 
F1 (); // 에코

코드가 실행 전에 약간의 미묘한 변화를 일어난해야이 프로그램은 JS 엔진은 실제로 전혀 아무 짓도? 이는 JS 실행 컨텍스트를 언급해야합니다.

JS 실행 컨텍스트

실행하기 전에 JS 코드는 JS 엔진은 항상 사실, 작업은 해당 실행 컨텍스트를 만드는 몇 가지 준비 작업입니다 않는다;

실행 콘텍스트와 세 개의 카테고리, 글로벌 실행 컨텍스트 함수 콘텍스트 및 콘텍스트 평가 ] 평가 인해 일반적으로 사용되지 않고, 여기에서 논의되지 않는다.

 

1. 글로벌 실행 컨텍스트

만 글로벌 실행 컨텍스트가 클라이언트가 일반적으로 브라우저에 의해 만들어진 , 그리고 윈도우 객체 알려져있다, 우리는이를 통해 직접 액세스 할 수 있습니다.

 

 

 미리 정의 된 메서드와 속성의 수에 글로벌 객체 창, 우리는 직접, 지구 환경에 어떤 속성에 이러한 방법에 액세스 할 수 있습니다 동안 지원 전역 변수 창 개체 또는 VAR 문을 . 우리는 전역 객체에 의해 생성 VAR, 창을 통해 직접 액세스 할 수 있습니다.

 

 

 2. 기능 실행 콘텍스트

기능 실행 컨텍스트 수많은있을 수 있습니다, 함수가 호출 될 때마다 함수 컨텍스트를 만들고 , 같은 함수를 호출하여 만듭니다하는 것으로 새로운 컨텍스트를 .

당신이 컨텍스트의 다른 유형을 할 것이라고 말했다, 숫자는 그들이 얼마나 사이의 관계를 만드는 데 여전히 많이뿐만 아니라에 대해 이야기했다 그것의 컨텍스트 관리 할 것입니다있는 데 스택 실행 컨텍스트를 .

 

실행 컨텍스트 스택 (실행 스택)

또한 호출 스택으로 알려진 실행 컨텍스트 스택 (이하 약칭 실행 스택), 실행 코드 중 실행 스택 만들어 모든 문맥이 저장의 LIFO 특성을 갖는 (후방 고급 성 먼저 아웃).

 

JS 코드 먼저 실행 윌 글로벌 실행 컨텍스트 및 실행 스택 압입 생성 , 실행 스택 LIFO의 특성으로 인해, 다음의 함수가 호출 될 때마다, 스택 내의 새 기능의 실행 콘텍스트와 압력을 만들 것이다

실행 JS 코드가 완료되기 전에 스택의 하단에로서 이해 될 수 영원히 글로벌 실행 컨텍스트가 .

 

함수 F1 () { 
    (F2); 
    CONSOLE.LOG ( 1 ); 
}; 

함수 F2 () { 
    F3 (); 
    CONSOLE.LOG ( 2 ); 
}; 

함수 F3 () { 
    CONSOLE.LOG ( 3 ); 
}; 

F1 (); // 3 2 1

 

우리는 스택 사이의 이해를 용이하게하기 위해, 위의 프로세스 실행 컨텍스트의 코드를 수행하여 관계를 설명, 우리는 실행 스택의 환상이 배열이 스택에 글로벌 실행 컨텍스트를 만듭니다 코드의 초기 실행, 그리고 따라서 프로세스가 같은 다음입니다 :

// 코드가 글로벌 실행 컨텍스트 생성하도록 실행되기 전에 
ECStack가 = [GlobalContext];
// F1 호 
ECStack.push ( 'functionContext F1' );
// F1과 통화가 실행 한 콘솔되지 전에 F2 완료 F2 
ECStack.push ( 'F2 functionContext를' );
// F2는 F3 완료하기 전에 2 콘솔에없는, F3 요구했다 
ECStack.push ( 'F3의 functionContext을' );
// F3은, 스택 (3)의 출력 완료 
ECStack.pop ();
// F2는 스택 (2)의 출력 완료 
ECStack.pop ();
// F1은 1을 출력하고 스택 완료 
ECStack.pop ();
// 이 때, 하나 개의 실행 스택 글로벌 실행 컨텍스트

 

그래서 여기에 우리가 실행 스택 및 저장 실행 컨텍스트의 규칙을 설명;, JS 엔진은 실행 컨텍스트를 생성하는 것을 준비하기 전에 내 이전 언급 한 코드가 실행되는 기억 구체적를 만드는 방법, 우리가 말을 계속했다.

실행 컨텍스트 생성 단계

분할 실행 컨텍스트의 생성 생성 단계와 구현 단계 두 단계 , 생성 단계를해야 이해하기 어려운, 우리는 창조의 단계로 시작합니다.

JS 실행 컨텍스트 생성 단계는 세 가지 책임이있다 :

이 결정 (1)

어휘 환경을 만들기 2. (LexicalEnvironment)

(VariableEnvironment를) 변수 환경 만들기 (3)

 

여기에 난 그냥 생성 과정을 표현하기 위해, 다른 사람에서 의사 코드 데이터를 변환 배울 것이다 :

의 ExecutionContext = {  
     // 이 값 결정 
    ThisBinding = < 이러한 값> ,
     // 어휘 환경 만들기를 
    LexicalEnvironment = {}
     // 변수 환경 생성 
    을 VariableEnvironment = {} 
};


실행 컨텍스트는이 질문에 읽기 권한이 있어야합니다에 대한 다른 기사를 읽었다면 , 생성 프로세스의 실행 문맥이 설명하지 말아야 변수 개체의 범위는 / 액티브 오브젝트 물고기는 어떻게 , 어떻게 동일하지 다른 장소 대답이 나중에 설명합니다.

이 결정 (1)

이 바인딩, 글로벌 실행 컨텍스트의 공식 호출이 항상 같은 브라우저 환경으로, 전역 객체를 윈도우 객체에이 점을 지적한다.

기능의 구현의 문맥에서,이 함수의 값에 따라서 오브젝트를 호출하는 경우,이 오브젝트를 지칭 불린다. 그렇지 않으면이 일반적으로 전역 객체 창 또는 정의되지 않은 (엄격 모드)를 가리 킵니다.

 

2. 어휘 환경

여기서 변수 매핑 구성 식별자를 포함하는 어휘 환경은, 상기 식별자가 나타내는 변수 / 함수의 이름은 , 변수는 실제 오브젝트하는 단계를 포함하는 함수이다 [] 타입의 객체 또는 원래의 값에 대한 참조. (즉 읽을 수 없습니다)

로 어휘 환경 글로벌 어휘 환경기능 어휘 환경 이가지

 

글로벌 어휘 환경 :

그것은 환경 자체의 최 외층 인으로 외부 환경 레코드를 도입하면, 포함 된 것을 제외하고는, 널 모든 세계 객체 방법의 특성 및 VAR (선언) 전역 객체를 사용자 정의.

 

어휘 기능 환경 :

그것이 포함 유저 정의 함수의 모든 변수 뿐만 아니라, 포함 인자 개체 . 어휘 함수 환경 외부 환경, 지구 환경에 도입 될 수있다 환경은 다른 기능을 할 수있다 이것이 실제 코드를 제공 따른.

 

// 지구 환경 
GlobalExectionContext = {
     // 글로벌 어휘 환경 
    LexicalEnvironment : {
         // 환경 기록 
        EnvironmentRecord : { 
            유형 : "개체", // 객체 환경 기록의 유형 
            // 식별자 여기에 바인딩 
        }, 
        외부 : <  > 
    } 
} 
// 주위의 기능 
FunctionExectionContext = {
     // 함수 어휘 환경 
    LexicalEnvironment {
         // 환경 레코드 
        EnvironmentRecord { 
            유형 : "선언적은" // 선언적 환경 기록 입력
            // 식별자 여기에 바인딩 
        }, 
        외부 : <무료 가입 또는 outerfunction 환경 참조> 
    } 
};

 

3. 환경 변수

환경 변수는 어휘 환경, 그것은 어휘 환경의 모든 속성을 가지고 말할 수있는 등의 환경 기록의 도입과 외부 환경을 보유하고 있습니다. ES6에 대한 어휘 환경에서의 유일한 차이점 거짓말 변수 저장 및 CONST 함수 선언 문을하자 , 환경 변수 VAR에 저장된 변수는 단지 선언했다.

우리는 의사 코드의 무리에 의해 그들을 이해해야한다 :

A는 = 20 보자 ;  
CONST (B) = 30 ;  
var에 C; 

함수 곱 (E, F) {  
  VAR의 g = 20 ;  
 복귀 * F * 전자 g;  
} 

C = 곱셈 (20, 30);

 

우리는 위의 코드를 실행 컨텍스트를 만드는 과정을 설명 할 수있는 의사 :

A는 = 20 보자 ;  
CONST (B) = 30 ;  
var에 C; 

함수 곱 (E, F) {  
  VAR의 g = 20 ;  
 복귀 * F * 전자 g;  
} 

C = 곱셈 (20, 30);

우리는 위의 코드를 실행 컨텍스트를 만드는 과정을 설명 할 수있는 의사 :

// 글로벌 실행 컨텍스트 
GlobalExectionContext = {
     // 받는 바인딩이 전역 개체 
    ThisBinding : <개체 무료 가입> ,
     // 어휘 환경 
    LexicalEnvironment : {  
         // 환경 기록 
      EnvironmentRecord : {   
        유형 : "개체",   // 객체 환경 기록 
        @ AB의 CONST하자 여기서 작성된 가변 식별자 바인딩 
        <초기화>하십시오 ,   
        : B <초기화> ,    <FUNC>   
      } 
      // 지구 환경 외부 환경 널로서 도입 
      외측 <  >을   
    }
  
    VariableEnvironment : {   
      EnvironmentRecord : {   
        유형 : "개체",   // 객체 환경 기록 
        // 식별자이 여기에 생성 된 C var에 바인딩 
        C를 : 정의되지 않은,   
      } 
      // 외부 환경이 null로 소개되어 지구 환경 
      외부를 <  >   
    }   
  }

 

  // 함수를 실행 컨텍스트 
  FunctionExectionContext = {
      // 이 함수가 전역 객체를 바인딩 기본적으로 호출되기 때문에 또한 
    <회사 무료 가입 개체> 다음 ThisBinding ,
     // 어휘 환경 
    LexicalEnvironment : {   
      EnvironmentRecord : {   
        유형 : "선언적",   // 선언적 환경 기록 
        // 식별자 오브젝트 것은 여기 인자 결합 
        인수가 {0 : 30 길이 : 2 20 ,. 1 }   
      }   
      // 외부 환경 레코드 </ 무료 가입>에 도입 
      외측 <GlobalEnvironment>   
    } 
  
    VariableEnvironment {   
      EnvironmentRecord : {   
        유형 : "선언적",   //선언적 환경 레코드 
        // 식별자이 여기 생성 VAR 결합 g 
        g : 미정   
      }   
      // 외부 환경이 레코드에 도입 </ 무료 가입> 
      아우터 <GlobalEnvironment>   
    }   
  }

생성 단계에 값이 주어졌다에 내가 실행 컨텍스트에서 무대를 만들, 당신은 발견하지 않았습니다 모르겠 VAR 가변 함수 선언은 선언, var 문이 정의되지로 설정, 함수가 자신의 기능을 위해 설정되고, CONST이 설정되어 내버려 초기화되지 않은.

지금 당신은 항상 그것을 얼마나 사전에 함수 선언을 향상시키기 위해 변수를 알고 있고, 범위가 모두 초기화 단계 JS 엔진 다른 지정을 위해 만들어지기 때문에 왜, 임시 데드 존이 왜 const를 보자.

해당 코드 등 VAR의 생성의 초기 단계로서 할당 전에 환경 레코드에 따라 실행되는 경우, 상기 스테이지의 내용뿐만 아니라, 우리는 더 나은 이해되어야 구현 단계를 만들뿐만 아니라, 같은 CONST 값하게 할당 된 대응하는 값이있는 경우, 정의되지 값이 할당 된 경우, 초기화는, 어떠한 값이 정의되지 부여되지 않는다.

 

개요

1. 글로벌 실행 컨텍스트는 일반적으로,이 코드 실행을 만듭니다 브라우저에 의해 생성, 실행 문맥은 함수 호출 컨텍스트가 작성 횟수 얼마나 많은 함수가 호출되는 경우에만 기능이 생성됩니다.

 

2. 호출 스택은 FILO 규칙을 충족하기 위해, 모든 실행 컨텍스트를 저장하는 데 사용됩니다.

 

3. 다음 상황에 맞는 설정 단계는이 바인딩으로 나누어 져, 어휘 환경을 조성, 환경 변수 세 단계는 두 개의 차이는 어휘 환경 변수가 const를하자 문으로 함수 선언을 저장할 수 있지만 변수 환경 변수 var에 선언을 저장하는 것입니다.

 

4. 환경 기록 두 어휘 부분은 주로 기록 환경으로 이루어진 외부 환경, 지구 환경에 의해 도입하고, 외부 환경에 도입 콘텍스트 함수가 동일한 레코드 글로벌 null이 아니고,이 함수는, 지구 환경이나 기타 환경의 함수이다. 환경 기록은 선언적 환경 기록이라고, 객체, 함수 호출 전반적인 환경 기록, 동일하지 않습니다.

 

5. 당신은 변수 리프트, 개선 된 기능이 이유를 이해해야하지만, CONST을하지 않았다.

 

ES5 후 6.ES3 변수 개체와 활성 객체 전에 개념이 어휘 환경, 환경 변수에 의해 설명 될, 두 사람은 더 사용자 친화적 인 이해되는 개념과 충돌하지를 않습니다.

 

추천

출처www.cnblogs.com/Rivend/p/12616528.html