// 첫번째 변수 선언 + 초기화
var a = 10;
console.log(a); // 10
// 두번째 변수 선언 + 초기화
var a = 20;
console.log(a); // 20
// 세번째 변수 선언(초기화X)
var a;
console.log(a); // 20
// let 중복 선언
let a = 10;
let a = 20; // SyntaxError: Identifier 'a' has already been declared
// const 중복 선언
const b = 10;
const b = 20; // SyntaxError: Identifier 'b' has already been declared
var a = 10;
a = 20;
console.log(a); // 20
let b = 111;
b = 222;
console.log(b); // 222
const c = 111;
c = 222; // TypeError: Assignment to constant variable.
const는 상수를 선언하는 키워드다.
처음 선언할 때 반드시 초기화(값 할당)를 해주어야 한다.
const a = 10;
const b; // SyntaxError: Missing initializer in const declaration
function hello(){
var a = 10;
console.log(a);
}
hello(); // 10
console.log(a); //ReferenceError: a is not defined
hello 함수 내부에서 선언된 a변수는 함수 내부에서만 참조가 가능하며, 외부에서 참조시 에러가 발생한다.
if(true) {
var a = 10;
console.log(a); // 10
}
console.log(a); // 10
if(true) {
let a = 10;
console.log(a); // 10
}
console.log(a); // ReferenceError: a is not defined
if문의 블럭 내부에서 let으로 선언된 변수는 외부에서 참조되지 않는다.
sum이라는 함수를 실행해서 1+3값을 result에 넣으려고 한다.
var result = sum(1,3);
var sum = function(num1, num2){
return console.log(num1+num2); // sum is not a function
}
에러가 발생한다. sum이라는 함수는 분명 아래 존재하는데 말이다.
var로 선언되어 있는 변수들이 맨 위로 끌어올려진다. 이 때 변수만 선언될 뿐 초기화는 진행되지 않는다.
var result = undefined;
var sum = undefined;
result = sum(1,3); // 여기서 선언된 변수들에 초기화가 이루어진다.
sum = function(num1, num2){ // 마찬가지이다.
return console.log(num1+num2);
}
var result = sum(1,3); // 이 때는 실행이 된다.
function sum(num1, num2) // 함수 선언식으로 되어있기 때문에 함수가 그대로 끌어올여진다.
return console.log(num1+num2); // 4
}
var getName = 'olaf';
function getName(){
console.log('olaf');
}
console.log(typeof getName); // string
var getName; // undefined
function getName() {
console.log("appear");
}
console.log(typeof getName); // function
console.log(a); // ReferenceError: a is not defined
let a = 10;
1) 코드 실행 전에는 변수 선언만 진행한다.
2) 초기화는 코드 실행 과정에서 변수 선언문을 만났을 때 수행한다.
따라서 마치 호이스팅이 발생하지 않는 것처럼 보인다. → 변수의 선언과 초기화 사이에 일시적으로 변숫 값을 참조할 수 없는 구간을 TDZ(Temporal Dead Zone)라고 한다.
let a = 10; // 전역변수 a선언
if(true){
console.log(a); // ReferenceError: a is not defined
let a = 20; // 지역변수 a 선언
}
if문 블럭 내부에서 지역변수 a를 다시 선언하니 지역변수 a 앞에서 console.log()로 참조 시 에러가 발생한다. → 지역변수 a가 호이스팅되면서 TDZ 구간이 만들어졌기 때문이다.(지역변수가 전역변수보다 우선 순위를 갖는다.)
결론적으로 1순위로 const를 사용하고, 변숫 값을 재할당할 필요가 있을 때 let을 사용하면 될 것 같다. var는 특별한 경우를 제외하고는 가능한 사용하지 않는 추세인 듯 하다. 허용되는 것이 많을수록 버그가 생길 우려도 그만큼 커지기 때문이다😨