함수 안에 있는 선언들을 모두 끌어올려서 해당 함수 유효 범위의 최상단에 선언하는 것
함수 표현식의 익명함수는 호이스팅의 영향을 받지 않는 반면, 함수 선언식의 기명함수는 호이스팅의 영향을 받음
JavaScript Parser 실행 순서
주의사항
{...} 안에서만 유효호이스팅 대상
var로 선언된 변수와 var 선언함수만 호이스팅이 발생함선언부만 위로 끌어올려지며, 할당부 및 할당된 값은 끌어올려지지 않음let과 const 변수와 let과 const 선언함수는 호이스팅이 발생하지 않음Tip
console.log("hello"); // >> hello
var myname = "yz"; // var 변수
let myname2 = "lumpyspaceyz"; // let 변수
var myname; // var 변수의 선언부
// ---------------------------- // Hoisting으로 인해 끌어올려짐
console.log("hello"); // >> hello
myname = "yz"; // var 변수의 할당부
let myname2 = "lumpyspaceyz"; // let 변수는 호이스팅 되지 않음
console.log(name); // >> undefined
console.log(name2); // >> Error: Uncaught ReferenceError: name2 is not defined
var name = "yz"; // var 변수
let name2 = "lumpyspaceyz"; // let 변수
var name; // var 변수의 선언부
// ---------------------------- // Hoisting으로 인해 끌어올려짐
console.log(name); // >> undefined
console.log(name2); // >> Error: Uncaught ReferenceError: name2 is not defined
name2 = "yz"; // var 변수의 할당부
let name2 = "lumpyspaceyz"; // let 변수는 호이스팅 되지 않음
🙇🏻♀️ var 변수는 호이스팅으로 인해 우선적으로 유효범위 최상단에 선언되고 후에 할당되지만
let 변수는 호이스팅이 적용되지 않음
foo();
foo2();
function foo() { // 함수 선언식
console.log("hello"); // >> hello
}
var foo2 = function() { // var 변수의 함수 표현식
console.log("hello2"); // >> ERROR : Uncaught TypeError: foo2 is not a function
}
var foo2; // var 변수의 함수 표현식의 선언부
function foo() { // 함수 선언식
console.log("hello");
}
// ---------------------------- // Hoisting으로 인해 끌어올려짐
foo(); // >> hello
foo2(); // >> ERROR : Uncaught TypeError: foo2 is not a function
foo2 = function() { // var 변수의 함수 표현식의 할당부
console.log("hello2");
}
function printName(firstname) { // 함수 선언식
var result = inner(); // var 변수
console.log(typeof inner); // >> function
console.log("name is " + result); // >> name is inner value
function inner() { // 함수 선언식
return "inner value";
}
}
printName(); // 함수 호출
function printName(firstname) { // 함수 선언식
var result; // var 변수의 선언부
function inner() { // 함수 선언식
return "inner value";
}
// ---------------------------------------- // Hoisting으로 인해 끌어올려짐
result = inner(); // var 변수의 할당부
console.log(typeof inner); // >> function
console.log("name is " + result); // >> name is inner value
}
printName(); // 함수 호출
🙇🏻♀️ 호이스팅은 함수 선언문과 함수 표현식에서 서로 다르게 동작하기 때문에 주의
함수 선언식 function foo() {} 은 함수 자체가 호이스팅 됨
함수 표현식 var foo2 = function() {} 은 호이스팅이 일어날 때 foo2 변수 에 대한 선언만 호이스팅 되고, 할당은 후에 됨
function printName(firstname) { // 함수 선언식
var inner = function() { // var 변수의 함수 표현식
return "inner value";
}
var result = inner(); // var 변수
console.log("name is " + result); // >> name is inner value
}
printName(); // 함수 호출
function printName(firstname) {
var inner; // var 변수의 함수 표현식의 선언부
var result; // var 변수의 선언부
// ---------------------------------------- // Hoisting으로 인해 끌어올려짐
inner = function() { // var 변수의 함수 표현식의 할당부
return "inner value";
}
result = inner(); // var 변수의 할당부
console.log("name is " + result); // >> name is inner value
}
printName(); // 함수 호출
function printName(firstname) { // 함수 선언식
console.log(inner); // >> undefined : 선언은 되어 있지만 값이 할당되어있지 않은 경우
var result = inner(); // var 변수
// ERROR : TypeError inner is not a function
console.log("name is " + result);
var inner = function() { // var 변수의 함수 표현식
return "inner value";
}
}
printName(); // 함수 호출
function printName(firstname) {
var inner; // var 변수의 함수 표현식의 선언부
var result; // var 변수의 선언부
// ---------------------------------------- // Hoisting으로 인해 끌어올려짐
console.log(inner); // >> undefined : 선언은 되어 있지만 값이 할당되어있지 않은 경우
result = inner(); // var 변수의 할당부
// ERROR : TypeError inner is not a function
console.log("name is " + result);
inner = function() {
return "inner value";
}
}
printName(); // 함수 호출
🙇🏻♀️ ERROR에서 inner is not defined 오류가 아닌 inner is not a function 오류가 나는 이유는?
👉🏻 호이스팅에 인해 inner은 function이 할당되기 전에 선언되기 때문에 inner는 먼저 undefined로 지정됨
inner에 undefined가 지정되었다는 것은 즉, 아직은 함수가 아니라는 의미
var myName = "hi"; // var 변수 myName
function myName() { // 함수 선언식 myName
console.log("lumpyspaceyz");
}
function yourName() { // 함수 선언식 yourName
console.log("everyone");
}
var yourName = "bye"; // var 변수 yourName
console.log(typeof myName); // >> string
console.log(typeof yourName); // >> string
var myName; // var 변수의 선언부
var yourName; // var 변수의 선언부
function myName() { // 함수 선언식
console.log("yuddomack");
} // 함수 선언식
function yourName() {
console.log("everyone");
}
// ---------------------------------------- // Hoisting으로 인해 끌어올려짐
myName = "hi"; // var 변수의 할당부
yourName = "bye"; // var 변수의 할당부
console.log(typeof myName); // >> string
console.log(typeof yourName); // >> string
🙇🏻♀️ var 변수 선언이 함수 선언식보다 먼저 호이스팅 됨
var myName = "hi"; // 값이 할당된 var 변수 myName
var yourName; // 값이 할당되지 않은 var 변수 yourName
function myName() { // 함수 선언식 myName
console.log("lumpyspaceyz");
}
function yourName() { // 함수 선언식 yourName
console.log("everyone");
}
console.log(typeof myName); // >> string
console.log(typeof yourName); // >> function
var myName; // 값이 할당된 var 변수의 선언부
function myName() { // 함수 선언식 myName
console.log("myName Function");
}
function yourName() { // 함수 선언식 yourName
console.log("yourName Function");
}
// ---------------------------------------- // Hoisting으로 인해 끌어올려짐
myName = "Heee";
console.log(typeof myName); // >> string
console.log(typeof yourName); // >> function
❗️ 값이 할당되어 있지 않은 var 변수 yourName의 경우, 같은 이름의 함수 yourName에 변수가 덮어씌워짐
var myName = "hi"; // 값이 할당된 var 변수 myName
var yourName = "bye"; // 값이 할당되지 않은 var 변수 yourName
function myName() { // 값이 할당된 함수 선언식 myName
console.log("lumpyspaceyz");
}
function yourName() {} // 값이 할당되지 않은 함수 선언식 yourName
console.log(typeof myName); // >> string
console.log(typeof yourName); // >> string
var myName; // 값이 할당된 var 변수의 선언부
var yourName; // 값이 할당된 var 변수의 선언부
function myName() { // 값이 할당된 함수 선언식 myName
console.log("lumpyspaceyz");
}
// ---------------------------------------- // Hoisting으로 인해 끌어올려짐
myName = "hi";
yourName = "bye";
console.log(typeof myName); // >> string
console.log(typeof yourName); // >> string
❗️ 값이 할당되지 않은 함수 선언문 yourName의 경우, 같은 이름의 yourName 변수에 함수 선언문이 덮어씌워짐
코드의 가독성과 유지보수를 위해 가능한 호이스팅이 일어나지 않도록 함
이를 위해서 함수와 변수를 가급적 코드 상단부에 선언하고, var 대신 let이나 const를 사용한다