JavaScript에서 호이스팅(hoisting)이란, 인터프리터가 변수와 함수의 메모리 공간을 선언 전에 미리 할당하는 것을 의미한다.
그로 인해 함수(변수)를 호출하는 코드를 함수(변수)선언보다 앞서 배치할 수 있다.
아래의 예시를 살펴보자.
/*Code A*/
function Myname(name){
console.log('My name is' + name);
}
Myname(limuubin)
//'My name is limuubin'
------------------------------------------------------------------------
/*Code B*/
Myname(limuubin)
function Myname(name){
console.log('My name is' + name);
}
//'My name is limuubin'
code A 의 경우에는 "함수(변수)선언" -> "함수(변수)호출" 의 순서이고,
code B 의 경우에는 "함수(변수)호출" -> "함수(변수)선언" 의 순서이다.
하지만 두 코드의 결과는
'My name is limuubin'
으로 같은 것을 볼 수 있다.
이와 같은 동작 방식이 호이스팅(hosisting)을 통하여 JavaScript가 코드를 실행시키는 방법이다.
var, let, const
의 차이점
var의 경우 동일한 변수 이름(color)이라도 여러번의 선언이 가능하고, 여러번 할당도 가능하다.
var color = 'blue'
console.log(color)
var color = 'red'
console.log(color)
/*실행결과*/
//blue
//red
var
의 경우에는 위와 같이 변수 선언과 할당이 자유롭게 에러없이 동작한다.
이는 자유롭게 변수를 선언하고 할당하는 장점은 있지만,
코드가 길어지는 경우에는 원하지 않는 결과가 나올 수 있는 위험과, 가독성이 떨어지는 단점이 있다.
let의 경우 동일한 변수 이름(color)은 한번의 선언만 가능하고, 할당은 여러번 가능하다.
/*동일한 변수로 여러번 선언 한 경우 에러가 도출된다*/
let color='blue'
console.log(color)
let color='red'
console.log(color)
/*실행결과*/
//Uncaught SyntaxError: Identifier 'color' has already been declared.
------------------------------------------------------------------------------------
/*한번의 선언과 여러번의 재할당의 경우 문제 없이 작동한다*/
let color = 'blue'
console.log(color)
color='red'
console.log(color)
color='green'
console.log(color)
/*실행결과*/
//blue
//red
//green
let
의 경우에는 위와 같이 한번의 선언과 여러번의 재할당이 가능하다.
그렇기 때문에 유동적으로 값이 달라지는 결과를 할당할 때 사용한다.
const의 경우 선언과 할당 모두 한번만 가능하다.
/*동일한 변수로 여러번 선언 한 경우 에러가 도출된다*/
const color = 'blue'
console.log(color)
const color = 'red'
console.log(color)
/*실행결과*/
//Uncaught SyntaxError: Identifier 'color' has already been declared.
------------------------------------------------------------------------------------
/*한번의 선언과 여러번의 재할당의 경우에도 에러가 도출된다*/
const color = 'blue'
console.log(color)
color = 'red'
console.log(color)
color='green'
console.log(color)
/*실행결과*/
//blue
//VM2527:3 Uncaught TypeError: Assignment to constant variable.
------------------------------------------------------------------------------------
/*한번의 선언과 한번의 할당의 경우 문제 없이 작동한다*/
const color1 = 'blue'
console.log(color1)
const color2 = 'red'
console.log(color2)
//blue
//red
const
의 경우에는 한번의 선언과 한번의 할당만 가능하기 때문에
변해서는 안되는 값을 다룰 때 사용한다.
JavaScript ES6가 도입된 이후에는 세가지 변수 선언 키워드 (var, let, const)에서 var
는 사용하지 않는 것을 추천한다.
재할당이 필요한 경우에는 let
을 사용하고,
재할당이 필요하지 않은 경우에는 const
를 사용하는 것을 권장한다.
또한 함수 선언과, 위의 키워드를 사용한 변수 선언 모두
Javascript의 Hoisting에 영향을 받기 때문에,
선언과 호출의 위치에 관계없이 잘 동작한다.
호이스팅 : 스코프내부 어디에서든 변수선언은 최상위에 선언된 것 처럼 행동