JavaScript 의 실행 환경 과 역할 도 메 인 체인

머리말
JS 에서 의 실행 환경 과 역할 도 메 인 체인 은 매우 중요 한 개념 으로 JS 엔진 이 JS 코드 를 처리 할 때 변수 와 함수 에 대한 처리 방식 이다.이 두 개념의 정확 한 이 해 는 우리 가 코드 의 행 위 를 잘 이해 하고 예측 하 는 데 도움 을 줄 수 있다.
실행 환경
실행 환경 은 변수 나 함수 가 접근 할 수 있 는 데이터 집합 을 정의 합 니 다.모든 실행 환경 은 이와 관련 된 변수 대상 이 있 습 니 다.이 실행 환경 에서 정의 하 는 모든 변수 와 함 수 는 이 대상 에 저 장 됩 니 다.이 대상 에 직접 접근 할 수 없습니다.이 대상 은 해석 기 가 데 이 터 를 처리 할 때 만 사용 합 니 다.
우리 가 평소에 말 하 는 전역 변 수 는 가장 외곽 의 실행 환경 에서 정 의 된 변수 이다.전역 실행 환경 은 ECMAScript 에 따라 서로 다른 표현 을 한다.웹 브 라 우 저 에서 전역 실행 환경 은window대상 이 고 모든 전역 변수 와 함 수 는window대상 의 속성 과 방법 으로 만들어 진 것 이다.nodejs 의 실현 에서 전체 집행 환경 은global대상 이다.
전체 실행 환경 을 제외 하고 모든 함수 가 자신의 실행 환경 을 가지 고 있 습 니 다.실행 흐름 이 하나의 함수 에 들 어 갈 때 함수 의 환경 은 하나의 환경 스 택 에 추 가 됩 니 다.함수 가 실 행 된 후에 스 택 은 그 환경 을 팝 업 시 켜 제어 권 을 이전의 실행 환경 으로 되 돌려 줍 니 다.즉,특정한 실행 환경 에서 코드 가 모두 실 행 된 후에 이 환경 은 소각 되 고 그 안에 저 장 된 모든 변수 와 함수 정의 도 이에 따라 소각 되 며 전체 실행 환경 은 응용 프로그램 액 이 출시 될 때 까지―예 를 들 어 웹 페이지 나 브 라 우 저가 닫 힐 때 까지 소각 된다.
역할 영역 체인
앞에서 말 했 듯 이 모든 실행 환경 은 환경 에서 정 의 된 변수 와 함 수 를 저장 하 는 변수 대상 이 있 습 니 다.환경 은 층 층 이 포 함 된 것 이기 때문에 코드 가 새로운 환경 에 들 어가 서 실 행 될 때 변수 대상 의 역할 도 메 인 체인 을 만 들 고 포 함 된 실행 환경 간 의 변수 대상 을 질서 있 게 연결 합 니 다.역할 도 메 인 체인 의 가장 중요 한 역할 은 현재 실행 환경 이 접근 할 수 있 는 변수 와 함 수 를 확보 하고 질서 있 게 찾 는 것 이다.역할 도 메 인 체인 의 맨 전단 은 현재 실행 중인 코드 가 처 한 실행 환경의 변수 대상 입 니 다.만약 에 이 환경 이 함수 라면 함수 의 활동 대상 을 변수 대상 으로 하고 함수 에서 새로운 변 수 를 정의 하지 않 았 을 때 이 활동 은 함수 의arguments 대상 입 니 다.역할 도 메 인 체인 의 다음 변 수 는 모두 시 앙 은 현재 실행 환경의 포함 환경 에서 비롯 되 고 순서대로 유추 하 며 한 층 씩 구성 되 어 전체적인 집행 환경 을 알 고 있다.전역 실행 환경의 변수 대상 은 항상 역할 영역 체인 의 마지막 대상 입 니 다.
우리 의 코드 가 실 행 될 때 만 나 는 모든 식별 자 분석 은 역할 도 메 인 체인 을 따라 한 단계 씩 검색 합 니 다.역할 도 메 인 체인 의 전단(현재 실행 환경의 변수 대상)에서 한 단계 씩 뒤로 거 슬러 올 라 가 식별 자 를 찾 을 때 까지 역할 도 메 인 체인 에서 이 식별 자 를 찾 지 못 하면 오류 가 발생 할 수 있 습 니 다.우리 가 자주 만 나 는 Uncaught Reference Error:x is not defined 는 바로 이 오류 가 브 라 우 저 에서 의 표현 입 니 다.
JS 해석 기 는 실행 할 때 변수 와 함 수 를 미리 설명 합 니 다.함 수 를 설명 할 때 함수 에[scope]속성 을 줍 니 다.이 속성 에는 현재 함수 에 환경 을 포함 하 는 모든 변수 대상 이 포함 되 어 있 습 니 다.즉,우리 함수 가 설명 을 앞 당 길 때 환경 을 포함 하 는 역할 도 메 인 체인 이 생 성 되 었 습 니 다.그리고 함수 가 실 행 될 때 자신의 arguments 와 내부 에서 정 의 된 함수 와 변 수 를 하나의 변수 대상 으로 포장 하여 scope chain 의 마지막 에 추가 합 니 다.
함수 매개 변수 도 변수 로 취급 되 기 때문에 접근 규칙 은 실행 환경의 다른 변수 와 같 습 니 다.
역할 도 메 인 체인 의 이러한 특성 을 이해 하 는 것 도 비교적 직관 적 이지 만 실제 코드 에서 상황 이 매우 많 기 때문에 어떤 행 위 는 직관 적 이거 나 오해 하기 쉽다.예 를 들 어 아래 의 상황:
역할 도 메 인 체인 은 실행 위치 가 아 닌 함수 정의 위 치 를 봅 니 다.

var x = 10
bar()
function foo() {
 console.log(x)
}
function bar(){
 var x = 30
 foo()
}
이 예 에서 bar()가 30 을 출력 할 것 이 라 고 착각 하 는 사람 이 있 을 수 있 습 니 다.우 리 는 함수 가 쌓 여 있다 는 것 을 이해 하기 만 하면 함수 이름 은 함수 더미 의 주 소 를 가리 키 는 인용 일 뿐 입 니 다.함수 가 실 행 될 때 이 인용 에 따라 쌓 여 있 는 함수 에 따라 실 행 됩 니 다.그래서 우리 가 어디서 함 수 를 실행 하 든 함수 의 위 치 는 변 하지 않 습 니 다.우 리 는 역할 도 메 인 체인 을 봅 니 다.우 리 는 역할 도 메 인 체인 이 함수 가 어디에서 실행 되 는 지 보 는 것 이 아니 라 함수 가 어디에서 정의 되 는 지 보 려 고 합 니 다.역할 도 메 인 체인 은 함수 성명 일 때 이미 생 성 되 었 다 고 볼 수 있 습 니 다.
개인 적 으로 ECMAScript 가 이러한 역할 도 메 인 체인 을 처리 하 는 것 은 역할 도 메 인 체인 이 계속 유지 되 지 않 고 환경의 내장 에 따라 일치 성 을 유지 하기 위해 서 라 고 생각 합 니 다.
폐쇄 하 다
전역 실행 환경의 변수 대상 이 시종 존재 하 는 것 을 제외 하고 다른 국부 함수 의 변수 대상 은 모두 함수 의 실행 과정 에서 만 존재 한다.일반적으로 함수 가 실 행 된 후에 국부 활동 대상 은 소각 되 고 메모리 에 전역 실행 환경의 변수 대상 만 저장 되 지만 폐쇄 하 는 상황 은 다르다.
패 킷 을 닫 는 것 은 다른 함수 역할 영역 에 접근 할 수 있 는 변 수 를 말 합 니 다.예 를 들 어 다음 과 같 습 니 다.

 function outer(){
   var scope = "outer";
   return function (){
    return scope;
   }
 }
var fn = outer();
fn();
함수 내부 에서 정 의 된 함 수 는 함수(즉 외부 함수)를 포함 하 는 활동 대상 을 그의 역할 도 메 인 체인 에 추가 하기 때문에outer함수 내부 에서 정 의 된 익명 함수(우 리 는 아래 에 이 익명 함 수 를inner 함수 라 고 부 르 는 역할 도 메 인 체인 에 실제 적 으로 외부 함수outer() 의 활동 대상 을 포함 합 니 다.다음 그림 은 코드 가 실 행 될 때outer inner 함수 의 역할 도 메 인 체인 을 읽 을 수 있 습 니 다.

익명 함수 가outer()에서 되 돌아 온 후에 도inner() 함 수 는outer() 에서 정 의 된 모든 변 수 를 방문 할 수 있 습 니 다.즉,outer() 함수 가 실 행 된 후에 도 활동 대상 은 소각 되 지 않 습 니 다.익명 함수 의 역할 도 메 인 체인 은 여전히 이 활동 대상 을 인용 하고 있 기 때 문 입 니 다.다시 말 하면outer() 함수 가 실 행 된 후에 실행 환경 과 역할 도 메 인 체인 이 모두 소각 되 었 으 나 활동 대상 은 메모리 에 저장 되 어 있 습 니 다.익명 함수 가 소각 되 지 않 으 면 이 활동 대상 은 메모리 에 계속 존재 합 니 다.
js 의 대상 은 모두 더미 에 저장 되 어 있 습 니 다.우 리 는 코드 에 대상 에 대한 인용 이 라 고 썼 습 니 다.역할 도 메 인 체인 에서 도 마찬가지 입 니 다.그래서 위 에서 말 한 outer() 함수 가 실 행 된 후에 역할 도 메 인 체인 은 소각 되 었 지만 대상 은 존재 합 니 다.사실은 소각 한 것 은 인용 일 뿐 입 니 다.js 중의 쓰레기 처리 체제 의 전략 은 인용 계수 입 니 다.어떤 변수 나 대상 의 인용 횟수 가 0 일 때 메모리 가 회 수 됩 니 다.outer 함수 의 변수 대상 의 인용 은 두 가지 가 있 는데 하 나 는outer 의 역할 도 메 인 체인 과 익명 함수 의 역할 도 메 인 체인 이기 때문에 익명 함수 가 소각 되 지 않 으 면 이 인용 은 계속 존재 하고outer() 의 활동 대상 도 계속 존재 합 니 다.
바퀴 형 은'닫 기'의 뜻 은 내부 상 태 를 폐쇄 하 는 것 이 아니 라 외부 상 태 를 폐쇄 하 는 것 이다.한 함수 가 어떻게 외부 상 태 를 폐쇄 할 수 있 는 지 알 고 있다.외부 상태의scope가 효력 을 잃 었 을 때 자신 이 한 부 를 남 겼 다.

패 킷 을 닫 으 면 함 수 를 포함 하 는 역할 영역 을 가지 고 있 기 때문에 다른 함수 가 더 많은 메모 리 를 차지 하 는 것 을 회피 합 니 다.패 킷 을 지나치게 사용 하면 메모리 사용량 이 너무 많 고 필요 할 때 만 패 킷 을 사용 할 수 있 습 니 다.
총결산
모든 프로 그래 밍 언어 는 역할 영역 이라는 개념 이 있 습 니 다.우리 의 프로그램 은 변 수 를 중심 으로 작 동 합 니 다.그러면 언어 를 디자인 할 때 변 수 를 어떻게 저장 하고 어디 에 저장 하 는 지,우리 의 프로그램 이 대응 하 는 변 수 를 어떻게 찾 는 지 하 는 것 이 가장 먼저 해결 해 야 할 문제 입 니 다.한편,역할 도 메 인 은 언어 디자이너 가 이 문제 에 대해 작성 한 좋 은 규칙 으로 대상 을 저장 하고 검색 하 는 것 이다.이것 이 바로 역할 도 메 인의 개념 이다.JS 의 이 규칙 은 바로 역할 도 메 인 체인 입 니 다.우 리 는 프로그램 을 작성 할 때 우리 의 변수(그리고 함수)가 어떻게 저장 되 는 지,그리고 JS 엔진 이 식별 자 를 만 났 을 때 어떤 규칙 에 따라 변수 나 함 수 를 검색 하 는 지 알 아야 합 니 다.그래 야 더 신뢰 할 수 있 는 코드 를 쓸 수 있 습 니 다.
이상 은 자바 스 크 립 트 의 실행 환경 과 역할 도 메 인 체인 에 대한 상세 한 내용 입 니 다.자바 스 크 립 트 실행 환경 과 역할 도 메 인 체인 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 시기 바 랍 니 다!

좋은 웹페이지 즐겨찾기