기존 자바스크립트에서는 var로 변수 선언이 가능하였지만,
var의 한계점으로 인해 ES6부터는 const와 let이 나오게 되었다.(변수의 재선언과 호이스팅을 방지하기 위해)
본격적으로 var,const,let에 대해서 알아보기 위해서는
우선 자바스크립트에서 사용되는 변수가 무엇인지 알아야 된다.
const name = 'Junghun'
//변수명(식별자) : name
//변수 값(저장된 값) : 'Junghun'
//해당 값의 위치(메모리주소) : 눈에보이지는 않지만, 힙(heap)에 저장됨
//지금은 간단하게 0012CCGWH80 이라고 하자.
let name
console.log(name) // undefined --> 선언, 초기화까지 완료된 상태
let age = 1
console.log(age) // 1 --> 선언 초기화 할당까지 다 된 상태
var test = 123
console.log(test) // 123
var test = 456
console.log(test) //456
//함수가 아닌 곳에서 a라는 변수를 선언하였기 때문에 전역에서 console.log(a)사용이 가능
if(true){
var a = 1
}
console.log(a) // 1
//함수 레벨 스코프이기 때문에 함수 a에서 선언된 변수 b는 전역에서 사용이 불가능
function a(){
var b = 2
return 1
}
console.log(b) // ReferenceError: b is not defined
// SyntaxError : Identifier 'test' has already been declared
let test = 123
console.log(test)
let test = 456
let test = 123
test = 456
console.log(test) // 456
if(true){
let a = 1
}
console.log(a) // ReferenceError: a is not defined
function a(){
let b = 2
return 1
}
console.log(b) // ReferenceError: b is not defined
var a
console.log(a) // undefined --> 선언과 동시에 undefined로 초기화가 이루어짐
console.log(a)
var a // undefined --> 호이스팅으로 인해 코드가 선언문이 먼저 실행되어 이러한 결과가 나옴.
const a // SyntaxError: Missing initializer in const declaration
다른 말로는, 코드 실행전 모든 선언문을 유효범위(스코프)의 최상단으로 끌어올리는 행위라고 보면 됨.
console.log(a); // 선언 + 초기화 된 상태이므로 undefined
text = 'junghun!'; // (선언 + 초기화 + 할당 된 상태)
var a;
console.log(a); // junghun!
console.log(text); // (선언은 되었지만 초기화가 안되서 참조 불가능 -> 에러남)
let text; // 여기서 초기화 단계가 실행됨
foo1(); // Hello --> 함수 선언문에서는 호이스팅 일어난다.(모든 선언문은 호이스팅이 발생함)
console.log(foo2) // undefined --> var의 경우 선언과 동시에 초기화가 되므로 undefined
foo2(); // foo2라는 변수가 undefined로 초기화는 되었지만 함수가 할당이 되지 않았기 때문에 에러 발생
function foo1() {
console.log('Hello');
}
var foo2 = function() {
console.log('world');
}
참조 레퍼런스
https://www.howdy-mj.me/javascript/var-let-const/
https://hanamon.kr/javascript-%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85%EC%9D%B4%EB%9E%80-hoisting/