스코프 체인과 호이스팅
이를 이해하기 위해 자바스크립트 엔진에 대해 이해하면 좋은데, 이 글을 참고하자.
함수 레벨 스코프 : var
자바스크립트 실행은 함수에 따라 (A) 컴파일 단계, (B) 수행 단계가 재귀적으로 이뤄진다.
처음 자바스크립트 실행 시 main() 함수에 대한 (A), (B) 처리를 시작으로
내부에 새로운 함수 호출이 일어나면 새 함수에 대한 (A), (B) 처리, 그리고 또 내부 함수 호출이 있다면
그 함수에 대한 (A), (B) … 이런식으로 처리를 반복한다.
특정 함수 내 변수 var 의 선언은 본 함수 (A) 컴파일 단계에 정의되기 때문에 변수 var 의 스코프는 함수 레벨이 된다.
if, for 문과 같은 블록 레벨({}) 단위 변수를 위해 ES6 스펙에선 블록 레벨 스코프인 const, let이 새로 소개되었다.
스코프 체인
자바스크립트 엔진 실행 과정에서 살펴보았듯 특정 함수에 대한 (B) 수행 단계에서 변수 할당 시,
본 함수의 Heap 영역에 변수 선언이 되어있는지 먼저 검사한다.
만약 본 함수 내 변수가 선언되어있지 않았다면 해당 함수의 Heap 에서는 변수 선언을 찾을 수 없다.
이때 해당 함수가 호출되기 이전의 함수로 (hidden) A pointer for previous scope 를 통해 올라가면서
해당 함수 Heap Scope 에 변수가 선언되었는지 확인한다.
어떠한 함수에서도 변수 선언이 되어있지 않다면 가장 처음에 호출된 main() 함수까지 올라가면서 검색한다.
함수 호출 스택에 따라 가장 처음의 main() 함수까지 각 함수 Heap Scope 에 변수 선언 존재여부를 연쇄적으로 Chaining 하며 찾기때문에 이를 스코프 체인 이라고 부른다.
호이스팅
호이스팅은 변수나 함수의 선언이 끌어올려지는 것처럼 보이는 것을 말한다.
(A) 컴파일 단계에서 변수를 선언을 먼저하고, 다음 (B) 수행 단계에서 변수를 할당하기 때문에 같은 function-level 이라면
아래와 같이 변수 선언과 할당을 나누어서 하더라도 자바스크립트 엔진에서는 변수 선언이 먼저 된 것으로 처리된다.
a = 10
var a;
--------------------------
# Global Scope (window)
- a = 10
위 예시처럼 var a 선언이 같은 함수 레벨 내에서 최상단에 ‘말려올라간것’처럼 수행되기도 하지만,
만약 함수 내 변수가 선언되어있지 않았다면 Scope Chain 을 통해 main() 함수까지 올라가면서 변수 선언을 찾는다.
최종적으로 main() 함수 Heap Scope 에도 선언되어있지 않다면 main() 함수 영역에 변수를 선언해준다.
main() 에서 호출한 어떤 함수이든 Scope Chain 을 통해 방금 선언해준 변수를 바라볼테니 이는 전역 변수인것이다.
(main() 의 Heap Scope 영역 명칭은 Global Scope (window)이기도 하다.)
특정 함수내에 변수를 할당하였지만 본 변수는 어느 함수에도 존재하지 않는 변수이기에 main() 함수까지 ‘말려올라가서’ 전역 변수를 선언한것이 된다.
변수 선언이 ‘말려올라갔다’는 의미에서 이 모든 경우를 호이스팅 이라고 표현한다.
출처)
Javascript 엔진 개요 및 실행 과정으로 살펴보는 Hoisting 과 Closure
자바스크립트자바스크립트는 웹 페이지의 세 요소중 하나입니다. HTML: 웹 페이지(문서) 포맷을 정의하는 마크업 언어 CSS: 웹 페이지(문서)의 디자인 요소에 대한 언어 Javascript: 웹 페이지(문서)와
aaronryu.github.io
'언어 > JavaScript' 카테고리의 다른 글
[JavaScript] 자바스크립트 엔진 개요 (0) | 2023.11.28 |
---|---|
[JavaScript] async 와 await (0) | 2023.11.04 |
[JavaScript] Promise 객체 등장 배경 (0) | 2023.11.03 |
[JavaScript] const 와 불변(immutable) (0) | 2023.10.27 |