전역범위
인지 함수 범위
인지에 따라서 다르게 동작let
과 const
는 초기화 되지 않은 채로 저장이 되고, var
는 undefined
로 저장이 된다.var name; // 선언 [Hoisting O]
console.log(name); // undefined
name = 'Jung'; // 할당
console.log(name); // 'Jung'
console.log(name); // undefined
var name = 'Jung'; //[Hoisting O]
console.log(name); // 'Jung'
console.log(name); // ReferenceError
console.log(age); //undefined
const name = 'hoo00nn';
var age = 25;
ReferenceError
: const는 초기화되지 않은 채로 메모리에 저장이 되기 때문에 초기화 전에 변수를 참조할 수 없다.foo();
foo2();
function foo() { // 함수선언문
console.log("hello");
}
var foo2 = function() { // 함수표현식
console.log("hello2");
}
var foo2; // [Hoisting] 함수표현식의 변수값 "선언"
function foo() { // [Hoisting] 함수선언문
console.log("hello");
}
foo();
foo2(); // ERROR!!
foo2 = function() {
console.log("hello2");
}
foo
: 함수 선언문으로 hoisting이 일어나면서 'hello' console이 출력된다.foo2
: var로 변수값으로 선언되고 hoisting 되었다. 변수에 할당된 함수표현식은 끌어 올려지지 않았기 때문에 변수의 스코프 규칙을 그대로 유지하면서 Error가 발생한다. 선언된 foo2
는 함수가 아니기 때문에 TypeError
가 발생되었다.function printName(firstname) { // 함수선언문
var result = inner(); // "선언 및 할당"
console.log(typeof inner); // > "function"
console.log("name is " + result); // > "name is inner value"
function inner() { // 함수선언문
return "inner value";
}
}
printName(); // 함수 호출
함수표현식에서의 호이스팅
1) 함수표현식의 선언이 호출보다 위에 있는 경우 - 정상
function printName(firstname) { // 함수선언문
var result = inner(); // "선언 및 할당"
console.log(typeof inner); // > "function"
console.log("name is " + result); // > "name is inner value"
function inner() { // 함수선언문
return "inner value";
}
}
printName(); // 함수 호출
2) 함수표현식의 선언이 호출보다 아래에 있는 경우 - TypeError
function printName(firstname) {
var inner; // [Hoisting] 함수표현식의 변수값 "선언"
console.log(inner); // > "undefined"
var result = inner(); // ERROR!!
console.log("name is " + result);
inner = function() {
return "inner value";
}
}
printName(); // > TypeError: inner is not a function
https://gmlwjd9405.github.io/2019/04/22/javascript-hoisting.html
3) 함수표현식의 선언이 호출보다 아래에 있는 경우 (const/let 변수에 할당) - ReferenceError
function printName(firstname) { // 함수선언문
console.log(inner); // ERROR!!
let result = inner();
console.log("name is " + result);
let inner = function() { // 함수표현식
return "inner value";
}
}
printName(); // > ReferenceError: inner is not defined
// 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
https://velog.io/@hoo00nn/%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85Hoisting-%EC%9D%B4%EB%9E%80
호이스팅은 정말 싫어~