console.log(a) //undefined
var a = 1
console.log(a) //1
위 코드를 보면 a가 선언되기 전에 console.log() 함수를 이용하여 a를 출력했는데 에러가 발생하지 않고 'undefined'가 출력된다.
실제로 이런식으로 코딩 할 일은 없겠지만
무슨일이 일어난걸까?
console.log(a) //undefined
var a = 1
console.log(a) //1
이제서야 위에서 봤던 코드가 이해가 된다.
var a = 1로 선언된 변수가 호이스팅 되면서 a의 식별자가 JavaScript가 기억하고 있다가 (값은 가지고가지 않으므로 undefined) console.log(a)가 호출되며 undefined가 출력되는 것이다.
console.log(a) //undefined
a = 1
var a
console.log(a) //1
심지어 선언도 하지 않은 변수에 값을 할당해도 에러가 발생하지 않는걸 보면 JavaScript가 얼마나 느슨한 언어인지 알 수 있다.
for (var i = 0; i<5; i++){
console.log(i) // 0 1 2 3 4
}
console.log(i) // 5
얼핏보면 i를 for문 밖에서 호출하는 코드가 말도 안되보이지만 정말 함수만 제외하고 나머지 var 변수를 모두 전역변수로 올려버린다. (ㄷㄷㄷㄷㄷ)
var a = 1
console.log(a) //1
var a = 2
console.log(a) //2
a 변수가 호이스팅 되므로 a를 두 번 선언해도 전혀 에러가 발생하지 않는다!
(어디까지 느슨한거지...)
printLog() //HELLO JAVASCRIPT HOISTING
ㄹㄹㄹㄹㄹ
function printLog(){
console.log("HELLO JAVASCRIPT HOISTING")
}
함수의 경우도 printLog()가 호이스팅 되기 때문에 함수 선언 전에 함수를 사용해도 정상적으로 출력 가능하다.
printLog() //ReferenceError: printLog is not defined
printLog = function(){
console.log("HELLO JAVASCRIPT HOISTING")
}
단 함수표현식은 호이스팅되지 않는다.
var myName = "James"
function myName(){
console.log("Jessica")
}
function yourName(){
console.log("William")
}
var yourName = 'Jay'
console.log(typeof myName) //string
console.log(typeof yourName) //string
변수선언이 함수보다 먼저 끌올된다.
var myName;
function myName(){
console.log("Jessica")
}
function yourName(){
console.log("William")
}
var yourName = 'Jay'
console.log(typeof myName) //function
console.log(typeof yourName) //string
변수에 값이 할당되지 않은 경우 함수 선언문이 변수를 덮어쓴다.