ES5까지는 변수 선언 키워드가 var 밖에 없었다. 아래에서 var 키워드의 특징을 살펴보자.
// 변수 a를 선언했다. 그리고 이어서 아래에 다시 한 번 재선언 해보겠다.
var a = 1;
var a = 100;
console.log(a); // 100
// 아래 b는 선언 후 재선언 했지만, 초기화문이 없어서 var 키워드가 무시된다.
var b = 1;
var b;
console.log(b); // 1
// 예제 1
var a = 1;
// a는 전역 변수이고, 아래에서 중복 선언 되며 의도치 않게
// 변수값이 바뀌는 부작용이 생긴다.
if (true) {
var a = 10;
}
console.log(a); // 10
// 예제 2
var a = 1;
const func = () => { var a = 10 };
console.log(a); // 1
var i = 10;
for (var i = 0; i < 5; i++) {
console.log(i);
}
// for 문안에서만 사용하려 했지만 의도치 않게 값이 변경되었다.
console.log(i); // 5
현상
을 말하며 그 행위 자체를 말하는 것이 아니다.undefined
를 반환한다.// 호이스팅에 의해 이미 a는 선언, 초기화가 진행 되었다.
console.log(a); // undefined
a = 10;
console.log(a); // 10
var a;
위에서 본 var 키워드의 단점을 보완하기 위해 ES6에서는 let, const 키워드를 도입했다. 아래에서 let 키워드의 특징을 살펴보겠다.
let a = 1;
let a = 100; // SyntaxError
let a = 1;
if (true) {
let b = 2;
}
console.log(a); // 1
console.log(b); // ReferenceError: b is not defined
잠깐 생각...
let i = 10;
function a = () => {
let i = 100;
for(let i = 0; i < 3; i++) {
console.log(i); // 1, 2
}
console.log(i); // 100
}
console.log(i); // 10
일시적 사각지대
라고 부른다.console.log(a); // ReferenceError
// ---------------
// 일시적 사각지대
// ---------------
let a; // 초기화 진행
a = 1; // 할당 진행
var 키워드로 선언한 전역 변수
, 그리고 전역 함수
, 선언하지 않은 변수에 값을 할당한 암묵적 전역
은 전역 객체 window의 프로퍼티가 된다.var a = 1; // 전역 변수
b = 2; // 암묵적 전역
function c() {} // 전역 함수
console.log(window.a); // 1
console.log(a); // 1 위와 같음
console.log(window.b); // 2
console.log(b); // 2 암묵적 전역은 전역 객체의 프로퍼티.
console.log(window.c); // 1
console.log(c); // 1 위와 같음
let a = 1;
console.log(window.a); //undefined
console.log(a); // 1
const 키워드는 상수를 선언하기 위해 사용한다. 하지만 반드시 상수만을 위해 사용하지는 않는다. const 키워드는 let 키워드와 대부분 동일하며 다른 점을 중심으로 살펴보겠다.
const a = 1; // 선언, 초기화 동시 진행
const a; // 문법 에러 발생
const a = 1;
a = 2; // 타입 에러
let preTaxPrice = 100; // 세전 가격
let afterTaxPrice = preTaxPrice + (PreTaxPrice * 0.1); // 세후 가격
console.log(afterTaxPrice); // 110
불변
을 의미하지는 않는다. 프로퍼티의 동적 생성, 삭제, 값의 변경을 통해 객체를 변경하는 것이 가능하다.const a = { name: 'Lee' };
a.name = 'Choi';
console.log(a) // { name: 'choi' }
var
vs let
vs const