-
15장. let, const 키워드와 블록 레벨 스코프책/모던 자바스크립트 딥다이브 2022. 4. 24. 11:34
15장. let, const 키워드와 블록 레벨 스코프
15-1. var 키워드로 선언한 변수의 문제점
- 변수 중복 선언 허용
- 같은 스코프 내에서 중복 선언을 허용한다.
- 초기화문이 있으면 var 키워드가 없는 것 처럼, 없으면 무시
var x = 1; var y = 1; var x = 100; var y; console.log(x); // 100 console.log(y); // 1
- 함수 레벨 스코프
- 함수의 코드 블록만을 지역 스코프로 인정한다.
- 함수 레벨 스코프는 전역 변수를 남발할 가능성을 높인다.
var x = 1; var i = 10; if (true) { var x = 10; } for (var i = 0; i < 5; i++) { console.log(i); // 0 1 2 3 4 } console.log(x); // 10 console.log(i); // 5
- 함수의 코드 블록만을 지역 스코프로 인정한다.
- 변수 호이스팅
- 변수 선언문이 스코프의 선두로 끌어 올려진 것 처럼 동작한다.
15-2. let 키워드
- 변수 중복 선언 금지
let bar = 123; let bar = 456; // SyntaxError: Identifier 'bar' has already been declared
- 블록 레벨 스코프
let foo = 1; { let foo = 2; let bar = 3; } console.log(foo); // 1 console.log(bar); // ReferenceError: bar is not defined
- 변수 호이스팅
- var 키워드로 선언한 변수는 런타임 이전에 JS 엔진에 의해 암묵적으로 ‘선언', ‘초기화' 단계가 한번에 진행된다.
- let 키워드로 선언한 변수는 ‘선언', ‘초기화' 단계가 분리되어 진행된다. 즉, 런타임 이전에 JS 엔진에 의해 암묵적으로 선언 단계가 먼저 실행되지만 초기화 단계는 변수 선언문에 도달했을 때 실행된다.
- 선언 - TDZ - 초기화 - 할당
- 호이스팅에 의해 끌어 올려져 선언됨.
- var 의 경우 여기서 undefined 로 초기화 되지만 let 의 경우 초기화가 같이 진행되지 않고 TDZ 구간에 도달함.
let foo;
를 만나면foo = undefined
로 초기화됨.foo = 1;
을 만나면foo = 1
로 할당됨.
console.log(foo); // ReferenceError, TDZ (Temporal Dead Zone) let foo; console.log(foo); foo = 1; console.log(foo);
선언 Ref error TDZ Ref error let foo; 초기화 foo === undefined foo = 1; 할당 foo === 1
모든 선언은 호이스팅한다. 단, let, const, class 를 사용한 선언문은 호이스팅이 발생하지 않는 것 처럼 동작한다.let foo = 1; { console.log(foo); // RefError let foo = 2; } // let 키워드로 선언한 변수도 호이스팅이 발생한다. // 호이스팅이 발생하지 않았다면 1이 출력되어야 하는데 참조 에러가 발생한다. // 호이스팅이 발생해서 밑 줄의 let foo 가 끌어올려져서 Ref Error 가 발생하는 것이다.
- 선언 - TDZ - 초기화 - 할당
console.log(foo); // ReferenceError let foo;
- 전역 객체와 letvar 키워드로 선언한 전역 변수와 전역 함수, 그리고 선언하지 않은 변수에 할당한 암묵적 전역은 전역 객체 window의 프로퍼티가 된다.let 키워드로 선언한 전역 변수는 전역 객체의 프로퍼티가 아니다.
let x = 1; console.log(window.x); // undefined console.log(x); // 1
var x = 1; y = 2; function foo() {} console.log(window.x); // 1 console.log(x); // 1 console.log(window.y); // 2 console.log(y); // 2 console.log(window.foo); // foo() {} console.log(foo); // foo() {}
15-3. const 키워드
let 키워드와 대부분 동일하므로 let 과 다른 점에 대해 알아보자.
- 선언과 초기화
- const 키워드로 선언한 변수는 반드시 선언과 동시에 초기화해야 한다.
- 재할당 금지
const foo = 1; foo = 2; // TypeError: Assignment to constant variable.
- 상수
- 원시 값을 할당한 경우 변수 값을 변경할 수 없는데 이 특징을 이용해 상수를 표현하는데 사용하곤 한다.
- 상태 유지, 가독성, 유지보수의 편의를 위해 적극적으로 사용해야 한다.
const TAX_RATE = 0.1; // 상수의 경우 대문자 + 스네이크 케이스로 표현하는게 일반적이다. let preTaxPrice = 100; let afterTaxPrice = preTaxPrice + (preTaxPrice * TAX_RATE);
- const 키워드와 객체
- 원시값의 경우 변경할 수 없지만 객체를 할당한 경우 변경할 수 있다.b. const 키워드는 재할당을 금지할 뿐 “불변”을 의미하지 않는다. 즉, 프로퍼티 동적 생성, 삭제, 프로퍼티 값의 변경을 통해 객체를 변경하는 것은 가능하다.
const person = { name: 'subin' }; person.name = 'foo'; console.log(person); // {name: 'foo'}
15-4. var vs. let vs. const
- 기본적으로 const 사용, 재할당이 필요한 경우에 한정해 let 사용
var 사용 하지않음, 이 변수가 재할당이 필요할지 선언 시점에는 잘 모르니 일단 const 사용함, 나중에 재할당이 필요하다고 느껴지면 그때 let 으로 변경하여 사용, 스코프는 최대한 좁게.
'책 > 모던 자바스크립트 딥다이브' 카테고리의 다른 글
17장. 생성자 함수에 의한 객체 생성 (0) 2022.04.24 16장. 프로퍼티 어트리뷰트 (0) 2022.04.24 14장. 전역 변수의 문제점 (0) 2022.04.24 4장. 변수 (0) 2022.04.24 모던 자바스크립트 Deep Dive 책 샀다. (0) 2021.12.16 - 변수 중복 선언 허용