var myName = 'kimseoyeong'; console.log(myName); // kimseoyeong var myName = 'sara'; console.log(myName); // sara
let myName = 'kimseoyeong'; console.log(myName); // kimseoyeong let myName = 'sara'; console.log(myName); // Uncaught SyntaxError: Identifier 'myName' has already been declared myName = 'sara'; console.log(myName); // sara
let myName = 'kimseoyeong'; console.log(myName); // kimseoyeong let myName = 'sara'; console.log(myName); // Uncaught SyntaxError: Identifier 'myName' has already been declared myName = 'sara'; console.log(myName); // Uncaught TypeError: Assignment to constant variable
console.log(name) // undefined => 선언 이전에 참조
var name = "김서영" // 선언
즉, javascript에서 변수들은 실제 실행 시에 코드의 최상단으로 끌어올려지게 되고, 이러한 이유 때문에 var로 선언된 변수는 선언 시에 undefined로 값이 초기화 되는 과정이 동시에 일어남
반면 let, const는 호이스팅이 일어나면 에러를 발생시킴
변수가 선언되고 변수의 초기화가 이루어지기 전까지의 구간
var는 선언과 초기화 단계가 동시에 이루어짐
let, const는 선언, 초기화, 할당 단계가 각각 따로 이루어짐
function은 선언, 초기화, 할당 단계가 동시에 이루어짐
=> 선언과 초기화 단계가 따로 이루어지는 let, const같은 경우는 TDZ에 영향을 받는다.
function myName1() { console.log('내 이름은', myname); // 내 이름은 undefined var myname = '김서영'; }
=> myName1 함수 스코프 안에서 myname 변수가 선언되기 전에 참조했기 때문에 TDZ에러가 발생해야 하지만, var로 선언한 변수가 호이스팅되어 에러가 발생하지 않고 undefined가 표시
function myName2() { console.log('내 이름은', myname); let myname = '김서영'; } // Uncaught ReferenceError: Cannot access 'myname' before initialization
=> myName2 함수 스코프 안에서 let으로 선언된 myname 변수가 호이스팅은 되었지만 값이 초기화가 되기 전에 myname 변수를 사용하려 했기 때문에 에러 발생