Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
Tags
- 최원영 저자
- 이해할 수 있는
- 노개북
- 공부를 가장한 일기일지도
- IT 지식
- 개발자북클럽
- 자격증
- 구름edu
- K-Digital Credit
- 티스토리챌린지
- CodeStates
- 제로베이스
- boj
- 자바스크립트
- 오블완
- Do it! 시리즈
- js
- 노마드코더
- 톺아보기
- 엘리스코딩
- 백준
- javascript
- nomadcoders
- SQL 개발자
- 노마드 코더
- 알고리즘
- 프로그래머스
- SQLD
- 모던 자바스크립트 deep dive
- 비전공자를 위한
Archives
- Today
- Total
개발자를 희망하는 초보의 자기개발 이야기
JavaScript Scope chain과 Lexical scoping 본문
반응형

JavaScript Scope chain과 Lexical scoping
: 스코프는 변수의 유효범위를 나타냅니다. 함수는 중첩될 수 있기 때문에 함수의 지역 스코프도 중첩될 수 있습니다. 이렇게 스코프가 함수의 중첩에 의해 계층적인 구조를 갖게 되었을 때, 식별자를 유효범위 안에서부터 바깥쪽으로 차례대로 검색해 나가는 것을 스코프 체인이라고 합니다.
let x = 'global x';
function outer() {
console.log(x); // 'global x'
x = 'outer x';
function inner() {
console.log(x); //'outer x'
}
inner();
}
outer();
console.log(x); //'outer x'
- 4번째 줄 x는 호출 되기 전 전역변수 x가 가장 먼저 선언되었기 때문에 첫번째 줄 전역변수 x를 참조합니다.
- 5번째 줄 x가 재할당 되었습니다.
- 8번째 줄 x도 함수 내에 선언된 변수가 없기 때문에 상위의 스코프에서 해당 변수명을 찾아 참조합니다.
- 16번째 줄 x는 5번째 줄 x가 전역변수 x를 재할당 했기 때문에 최종적으로 변경된 전역변수를 참조합니다.
- 이렇게 상위 스코프, 하위 스코프로 계층 구조를 갖는 걸 스코프 체인이라고 합니다.
Lexical scoping
: 스코프는 함수를 호출할 때가 아니라 선언할 때 결정합니다. 즉 함수의 상위 스코프는 언제나 자신이 정의된 스코프를 기준으로 찾게 됩니다.
let x = 'global x';
function outer() {
console.log(x); // 'global x'
x = 'outer x';
}
function inner() {
console.log(x); //'global x'
}
inner();
outer();
console.log(x); // outer x
- 4번째 줄 x는 함수 내 동일한 변수명이 없어서 상위 스코프의 전역변수 x를 참조합니다.
- 9번째 줄 x는 함수 내 동일한 변수명이 없어서 상위 스코프의 전역변수 x를 참조합니다.
- 이 때 각 함수가 선언될 당시 outer함수는 실행전으로 9번째 줄 x는 5번째 줄 x가 아니라 전역변수 x를 참조합니다.
- 마지막 16번째 줄 x는 함수 실행이 되고 이미 전역변수 x가 outer x로 재할당 된 뒤기 때문에 결과값이 다릅니다.
- 이렇게 선언 기준으로 스코프를 결정 하는 것을 lexical scoping라고 합니다.
정리
- Scope chain은 식별자를 유효범위 안에서부터 바깥쪽으로 차례대로 검색해 나가는 것
- 스코프는 함수를 선언할 때 결정된다.
참고
반응형
'프론트엔드(Front-end) > JavaScript' 카테고리의 다른 글
| JavaScript Closure (0) | 2021.01.18 |
|---|---|
| JavaScript 실행 컨텍스트(execution context)와 호이스팅(hoisting) (0) | 2021.01.10 |
| JavaScript Scope (0) | 2021.01.10 |
| JavaScript Rest Parameter(나머지 매개변수) 와 Spread syntax(전개 연산자) (0) | 2021.01.10 |
| JavaScript 원시타입 & 참조타입(Primitive & Reference) (0) | 2021.01.10 |