15-1 var 키워드로 선언한 변수의 문제점
변수 중복 선언 허용
var 키워드로 선언한 변수는 중복 선언이 가능하다.
중복 선언시 에러도 발생하지 않아서 의도치 않게 먼저 선언된 변수 값이 변경되는 부작용이 발생한다.
함수 레벨 스코프
함수의 코드 블록만을 지역 스코프로 인정하기 때문에, 따라서 함수 외부에서 var 키워드로 선언한 변수는 코드 블록 내에서 선언해도 모두 전역변수가 된다.
함수 레벨 스코프는 전역 변수를 남발한 가능성을 높인다.
변수 호이스팅
변수 선언문 이전에 변수를 참조할 시 호이스팅이 되어 있기 때문에 참조가 가능하다. 이는 가독성을 떨어트리고 오류를 발생시킬 여지를 높인다.
15-2 let 키워드
변수 중복 선언 금지
let 키워드로 이름이 같은 변수를 중복 선언하면 문법 에러가 발생한다.
블록 레벨 스코프
let 키워드로 선언한 변수는 블록 레벨 스코프를 따른다.
변수 호이스팅
let 키워드로 선언한 변수는 변수 선언문 이전에 참조하면 참조 에러가 발생한다.
var 키워드로 선언한 변수는 선언 단계와 초기화 단계가 한번에 진행되지만 let 키워드로 선언한 변수는 선언 단계와 초기화 단계가 분리되어 진행된다.
만약 초기화 전에 변수에 접근하려고 하면 참조 에러가 발생한다. 이때를 일시적 사각지대라고 부른다.
주의할 점으로 변수 호이스팅이 발생하지 않는 것처럼 보이는 let 도 호이스팅이 발생한다. 그저 호이스팅이 발생하지 않는 것처럼 동작할 뿐이다.
let foo = 1; // 전역 변수
{
console.log(foo); // ReferenceError: Cannot access 'foo' before initialization
// 호이스팅이 발생하지 않는다면 위 참조 에러는 발생하지 않는다.
let foo = 2; // 지역 변수
}
전역 객체와 let
var로 선언한 전역변수는 암묵적으로 window 객체의 프로퍼티가 되지만 let는 보이지 않는 개념적인 블록 내에 존재하게 된다.
// 이 예제는 브라우저 환경에서 실행해야 한다.
// 전역 변수
var x = 1;
// 암묵적 전역
y = 2;
// 전역 함수
function foo() {}
// var 키워드로 선언한 전역 변수는 전역 객체 window의 프로퍼티다.
console.log(window.x); // 1
// 전역 객체 window의 프로퍼티는 전역 변수처럼 사용할 수 있다.
console.log(x); // 1
// 암묵적 전역은 전역 객체 window의 프로퍼티다.
console.log(window.y); // 2
console.log(y); // 2
// 함수 선언문으로 정의한 전역 함수는 전역 객체 window의 프로퍼티다.
console.log(window.foo); // ƒ foo() {}
// 전역 객체 window의 프로퍼티는 전역 변수처럼 사용할 수 있다.
console.log(foo); // ƒ foo() {}
15-3 const 키워드
const 키워드는 상수를 선언하기 위해 사용되지만, 상수만을 위해서 사용하지 않는다.
선언과 초기화
const 키워드는 반드시 선언과 동시에 초기화 해야 한다.
const키워드로 선언한 변수도 let과 마찬가지로 블록 레벨 스코프를 가지며, 변수 호이스팅이 발생하지만 발생하지 않는것 처럼 동작한다.
{
// 변수 호이스팅이 발생하지 않는 것처럼 동작한다
console.log(foo); // ReferenceError: Cannot access 'foo' before initialization
const foo = 1;
console.log(foo); // 1
}
// 블록 레벨 스코프를 갖는다.
console.log(foo); // ReferenceError: foo is not defined
재할당 금지
const 키워드로 선언된 변수는 재할당이 금지된다.
상수
상수는 재할당이 금지된 변수를 말한다.
const키워드로 선언한 변수에 원시 값을 할당한 경우 변수 값을 변경할 수 없다.
const 키워드와 객체
const키워드로 선언한 변수에 객체 값을 할당한 경우 변수 값을 변경할 수 있다. 객체는 변경 가능한 값mutable value이기 때문에 재할당 없이도 가능하다.
즉, const키워드는 재할당을 금지할 뿐 불변을 의미하지는 않는다.
const person = {
name: 'Lee'
};
// 객체는 변경 가능한 값이다. 따라서 재할당없이 변경이 가능하다.
person.name = 'Kim';
console.log(person); // {name: "Kim"}
15-4 var vs. let vs. const
변수 선언시 기본적으로 const를 사용한다.
재할당이 필요한 경우에 한정하여 let을 사용하는 것이 좋다.
var, let, const 키워드 사용시 권장사항
- ES6를 사용한다면 var는 사용하지 않는다.
- 재할당이 필요한 경우에 한정해 let키워드를 사용하고, 스코프는 최대한 좁게 만든다.
- 변경이 없고 읽기 전용으로 사용하는 원시 값과 객체에는 const를 사용한다.
const 키워드를 주로 사용하고, 재할당이 필요할시 let 으로 변경하자.
'모던 자바스크립트 Deep Dive' 카테고리의 다른 글
[모던 자바스크립트 Deep Dive] 함수와 일급 객체 (0) | 2024.05.17 |
---|---|
[모던 자바스크립트 Deep Dive] 전역 변수의 문제점 (0) | 2024.05.11 |
[모던 자바스크립트 Deep Dive] 스코프 (0) | 2024.05.11 |
[모던 자바스크립트 Deep Dive] 함수 (0) | 2024.05.11 |
[모던 자바스크립트 Deep Dive] 원시 값과 객체의 비교 (0) | 2024.05.03 |