var : let과 const가 생기기 전 변수 선언에 사용되던 문
- 각종 문제점들을 갖고 있으므로 오늘날에는 사용하지 않을 것을 권장
1. 선언 없이도 사용 가능
notDeclared = 1; // 미리 선언한 부분이 없을 시 var로 만들어짐
console.log(notDeclared);
// num이 var로 선언된 것
for (num of [1, 2, 3]) {
console.log(num);
}
2. 재선언 가능
let a = 1;
let a = 2; // ⚠️ 오류
const b = 1;
const b = 2; // ⚠️ 오류
3. 블록 레벨 스코프 무시
let num1 = 1;
{
let num1 = 2;
{
let num1 = 3;
}
}
console.log(num1);
var num2 = 1;
{
var num2 = 2;
{
var num2 = 3;
}
}
console.log(num2);
// for문의 스코프도 무시
for (var i = 0; i < 5; i++) {
var pow2 = i ** 2;
console.log(pow2);
}
console.log(i, pow2);
⭐️ 함수의 스코프는 유효함
var num3 = 1;
function func1 () {
var num3 = 2;
return num3;
}
console.log(num3);
console.log(func1());
4. 호이스팅
console.log(hoisted1); // ⚠️ 오류
console.log(hoisted1); // 💡 오류발생 X, 대신 undefined 반환
var hoisted1 = 'Hello';
console.log(hoisted1)
console.log(hoisted2); // ⚠️ 오류
let hoisted2 = 'Hello';
console.log(hoisted2)
- 엄연히는 let도 호이스팅 되지만 undefined로 초기화되지 않는 것
- 초기화되기 이전의 영역: 🔗 TDZ에 속함
⭐️ 이 외에도 다양한 상황에서 예기치 못한 문제를 야기