반응형
블록 스코프와 함수 스코프
- 모든 변수는 스코프 scope, 범위 가 있다
- var 은 함수 스코프, let 은 블록 스코프이다
- 함수 안에 선언된 변수는 함수 바깥에서는 접근할 수 없다
- 이처럼 함수를 경계로 접근 가능 여부가 달라지는 것을 함수 스코프(함수만 신경씀) 라고 한다
- 함수 스코프를 다르게 말하면 함수를 끝날 때 함수 내부의 변수도 같이 사라진다고 할 수 있다
- var 는 함수 스코프라서 if 문 안에 들어 있어도 if 문 바깥에서 접근할 수 있다
- let 은 블록 스코프(블록을 신경씀) 이다
- 블록은 if 문, for 문, while 문, 함수에서 볼 수 있는 중괄호 ({ })를 의미
- 블록 바깥에서는 블록 안에 있는 let 에 접근 할 수 없다
- let 뿐만 아니라 const 도 블록 스코프를 가진다
- 블록 스코프를 다르게 말하면 블록이 끝날 때 내부의 변수도 같이 사라진다고 할 수 있다
클로저와 정적 스코프
- 클로저 closure 는 간단히 말해 외부 값에 접근하는 함수 이다
- 모든 자바스크립트 함수는 클로저가 될 수 있다
- 함수가 선언된 위치에 따라 접근할 수 있는 값이 달라지는 현상을 '함수는 정적 스코프 lexical scope 를 따른다' 라고 표현한다
- 선언된 위치가 아니라 호출된 위치에 따라 접근할 수 있는 값이 달라진다면 동적 스코프 dynamic scope 를 따른다
- 자바스크립트는 정적 스코프를 따른다
let 과 var 를 사용한 결과가 다른 이유
- var 를 사용하면서 문제를 해결하고 싶다면 i 변수의 값을 고정할 방법을 찾아야 한다
- let 의 i 변수가 블록마다 값이 고정되는 것처럼 var 의 i 변수 값도 고정된다
- 클로저가 i 변수 대신 고정된 값을 가리키게 하면 된다
- for 문 대신 forEach( ) 메서드를 사용한다
- forEach ( ) 의 콜백 함수마다 고정된 i 값을 갖고 있어서 가능하다
- 사실 let 을 쓰는 것이 가장 편하다
- 요즘은 대부분 var 대신 let 을 사용한다
- switch 문을 사용하는 상황
const type = 'a';
switch (type) {
case 'a':
let name = '제로초';
break;
case 'b':
let name = '레오';
break;
case 'c':
let name = '체리';
break;
}
Uncaught SyntaxError: Identifier 'name' has already been declared
- 블록 스코프는 현재 switch 문 하나밖에 없다
- 이럴 때는 각자 블록 스코프를 생성하면 해결된다
const type = 'a';
switch (type) {
case 'a': {
let name = '제로초';
break;
}
case 'b': {
let name = '레오';
break;
}
case 'c': {
let name = '체리';
break;
}
}
반응형
'개발 이야기 > 개발 도서' 카테고리의 다른 글
제로초 자바스크립트 입문 <프로미스와 async / await> (0) | 2024.03.12 |
---|---|
제로초 자바스크립트 입문 <호출 스택과 이벤트 루프> (0) | 2024.03.12 |
제로초 자바스크립트 입문 <비동기와 타이머> (0) | 2024.03.11 |
제로초 자바스크립트 입문 <함수, 객체리터럴> (0) | 2024.03.10 |
제로초 자바스크립트 입문 <반복문, 객체 - 배열> (0) | 2024.03.10 |