console.log(name); // undefined
// => 선언 이전에 참조
var name = '홍길동'; // 선언
위 코드를 내부적으로는 아래와 같이 이해한다.
var name; // undefined로 초기화
console.log(name);
var name = '홍길동';
반면, let, const는 호이스팅이 일어나면 에러가 발생
console.log(name); // undefined
var name = '홍길동';
console.log(email); // Uncaught ReferencedError
let email = 'gildong@gmail.com';
console.log(age); // Uncaught ReferencedError
const age = 50;
같은 이름의 var 변수 선언과 함수 선언 중 어느 쪽이 먼저 선언될까?
var myName = "hi";
function myName() {
console.log("yuddomack");
}
function yourName() {
console.log("everyone");
}
var yourName = "bye";
console.log(typeof myName);
console.log(typeof yourName);
/** --- JS Parser 내부의 호이스팅(Hoisting)의 결과 --- */
// 1. [Hoisting] 변수값 선언
var myName;
var yourName;
// 2. [Hoisting] 함수선언문
function myName() {
console.log("yuddomack");
}
function yourName() {
console.log("everyone");
}
// 3. 변수값 할당
myName = "hi";
yourName = "bye";
console.log(typeof myName); // > "string"
console.log(typeof yourName); // > "string"
값이 할당되어 있지 않은 변수와 값이 할당되어 있는 변수에서의 호이스팅
var myName = "Heee"; // 값 할당
var yourName; // 값 할당 X
function myName() { // 같은 이름의 함수 선언
console.log("myName Function");
}
function yourName() { // 같은 이름의 함수 선언
console.log("yourName Function");
}
console.log(typeof myName); // > "string"
console.log(typeof yourName); // > "function"
값이 할당되어 있지 않은 변수의 경우, 함수선언문이 변수를 덮어쓴다.
값이 할당되어 있는 변수의 경우, 변수가 함수선언문을 덮어쓴다.
https://gmlwjd9405.github.io/2019/04/22/javascript-hoisting.html