[JavaScript] Scope Chain

Scope Chain

C언어에서 스코프가 블록{} 이듯이 자바스크립트에서는 함수가 스코프로 된다. 이 유효 범위를 나타내는 스코프는 [[scope]] 프로퍼티로 각 함수 객체 내에서 링크드 리스트형태로 관리되며 이를 스코프 체인이라 한다. 각각의 함수는 [[scope]]프로퍼티로 자신이 생성된 실행 컨텍스트의 스코프 체인을 참조한다. 함수가 실행되는 순간 실행 컨텍스트가 만들어지고 이 실행 컨텍스트는 실행된 함수의 [[scope]] 프로퍼티를 기반으로 새로운 스코프 체인을 만든다. 즉 현재 실행되는 함수의 [[scope]] 프로퍼티를 복사하고 새롭게 생성된 변수 객체를 해당 체인의 제일 앞에 추가한다.

1
2
3
4
5
6
7
8
9
10
11
12
var value = "value1";

function printValue() {
return value;
}

function printFunc(func) {
var value = "value2";
console.log(func()); //value1
}

printFunc(printValue);

위와 같은 코드에서 printValue()의 스코프 체인은 [0] 전역 객체 [1] printFunc 변수 객체 가 된다. 그리고 printValue()의 스코프 체인은 [0] 전역 객체 [1] printValue가 된다. printValue()의 스코프 체인이 [0] 전역 객체 [1] printFunc [2] printValue가 아닌 이유는 printValue()의 생성 시점의 실행 컨텍스트가 무엇인가에 있다. printValue는 전역 객체의 실행 컨텍스트에서 생성 되었으며 그렇기 때문에 전역 객체의 [[scope]]를 참조하게 된다.

Author: Song Hayoung
Link: https://songhayoung.github.io/2020/07/14/Languages/JS/scope_chain/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.