모던 자바스크립트 Deep Dive - 15장 let, const 키워드와 블록 레벨 스코프
JavaScript
2024.01.22
15.1 var 키워드로 선언한 변수의 문제점
변수 중복 선언 허용
함수 레벨 스코프
오로지 함수의 코드 블록만을 지역 스코프로 인정
함수 외부에서 var 키워드로 선언한 변수는 코드 블록 내에서 선언해도 모두 전역 변수가 됨
변수 호이스팅에 의해 var 키워드로 선언한 변수는 변수 선언문 이전에 참조 가능
15.2 let 키워드
변수 중복 선언 금지
let 키워드로 이름이 같은 변수를 중복 선언하면 문법 에러 (Syntax Error) 발생
블록 레벨 스코프
모든 코드 블록 (함수, if문, for문, while문, try/catch문 등)을 지역 스코프로 인정
let foo =1;// 전역 변수{let foo =2;// 지역 변수let bar =3;// 지역 변수}console.log(foo);// 1console.log(bar);// ReferenceError: bar is not defined
블록 레벨 스코프의 중첩
변수 호이스팅
var 키워드로 선언한 변수는 선언 단계와 초기화 단계가 동시에 진행
// var 키워드로 선언한 변수는 런타임 이전에 선언 단계와 초기화 단계가 실행됨// 따라서 변수 선언문 이전에 변수를 참조할 수 있음console.log(foo);// undefinedvar foo;console.log(foo);// undefined
foo =1;// 할당문에서 할당 단계가 실행됨console.log(foo);// 1
let 키워드로 선언한 변수는 선언 단계와 초기화 단계가 분리되어 진행
// 런타임 이전에 선언 단계가 실행됨. (아직 변수가 초기화되지 않음!)// 초기화 이전의 일시적 사각지대에서는 변수를 참조할 수 없음console.log(foo);// ReferenceError: foo is not definedlet foo;// 변수 선언문에서 초기화 단계가 실행됨console.log(foo);// undefined
foo =1;// 할당문에서 할당 단계가 실행됨console.log(foo);// 1
런타임 이전에 자바스크립트 엔진에 의해 암묵적으로 선언 단계가 먼저 실행되지만 초기화 단계는 변수 선언문에 도달했을 때 실행됨
스코프 시작 지점부터 초기화 단계 시작 지점(변수 선언문)까지 변수를 참조할 수 없음
→ 이 구간을 일시적 사각지대 (Temporal Dead Zone; TDZ)라 부름
let 키워드로 선언한 변수는 변수 호이스팅이 발생하지 않는 것처럼 보이지만 그렇지 않음
let foo =1;// 전역 변수{console.log(foo);// ReferenceError: Cannot access 'foo' before initializationlet foo =2;// 지역 변수}
여전히 호이스팅이 발생하기에 참조 에러(ReferenceError) 발생
모든 선언 (var, let, const, function, function*, class 등)은 호이스팅 함
let, const, class를 사용한 선언문은 호이스팅이 발생하지 않는 것처럼 동작
let, const 키워드로 선언한 변수는 전역 객체 window의 프로퍼티가 아님
15.3 const 키워드
const 키워드의 특징은 let 키워드와 대부분 동일함
선언과 초기화
const 키워드로 선언한 변수는 반드시 선언과 동시에 초기화해야 함.
재할당 금지
상수
상수는 재할당이 금지된 변수
const 키워드로 선언된 변수에 원시 값을 할당한 경우 원시 값은 변경할 수 없는 값이며 const 키워드로 인해 재할당이 금지되므로 할당된 값을 변경할 수 있는 방법은 없음
const 키워드와 객체
const 키워드로 선언된 변수에 객체를 할당한 경우 값을 변경할 수 있음
새로운 값을 재할당 하는 건 불가능
프로퍼티 동적 생성, 삭제, 프로퍼티 값의 변경을 통해 객체 변경 가능
const 키워드는 재할당을 금지할 뿐 "불변"을 의미하지 않음
15.4 var vs. let vs. const
ES6 사용 시 var 키워드 사용하지 않기
재할당이 필요한 경우에만 let 키워드 사용하고, 변수의 스코프는 최대한 좁게.
변경이 발생하지 않고 읽기 전용으로 사용하는 (재할당이 필요 없는 상수) 원시 값과 객체에는 const 키워드 사용
15.1 var 키워드로 선언한 변수의 문제점
var키워드로 선언한 변수는 코드 블록 내에서 선언해도 모두 전역 변수가 됨var키워드로 선언한 변수는 변수 선언문 이전에 참조 가능15.2 let 키워드
let키워드로 이름이 같은 변수를 중복 선언하면 문법 에러 (Syntax Error) 발생var키워드로 선언한 변수는 선언 단계와 초기화 단계가 동시에 진행let키워드로 선언한 변수는 선언 단계와 초기화 단계가 분리되어 진행→ 이 구간을 일시적 사각지대 (Temporal Dead Zone; TDZ)라 부름
let키워드로 선언한 변수는 변수 호이스팅이 발생하지 않는 것처럼 보이지만 그렇지 않음var,let,const,function,function*,class등)은 호이스팅 함let,const,class를 사용한 선언문은 호이스팅이 발생하지 않는 것처럼 동작let,const키워드로 선언한 변수는 전역 객체window의 프로퍼티가 아님15.3 const 키워드
const키워드로 선언한 변수는 반드시 선언과 동시에 초기화해야 함.const키워드로 선언된 변수에 원시 값을 할당한 경우 원시 값은 변경할 수 없는 값이며const키워드로 인해 재할당이 금지되므로 할당된 값을 변경할 수 있는 방법은 없음const키워드와 객체const키워드로 선언된 변수에 객체를 할당한 경우 값을 변경할 수 있음const키워드는 재할당을 금지할 뿐 "불변"을 의미하지 않음15.4 var vs. let vs. const
var키워드 사용하지 않기let키워드 사용하고, 변수의 스코프는 최대한 좁게.const키워드 사용const키워드는 재할당을 금지하기에var,let키워드보다 안전