함수안에 있는 선언들을 모두 끌어올려 해당 함수 유효범위의 최상단에 선언하는것을 말한다.
즉 함수 내 아래쪽에 위치해서 존재하는 내용 중 필요한 값들을 끌어올리는 것
but, 실제로 끌어올려지는 것이 아니라 자바스크립트 내부적으로 끌어올려서 처리하는것 때문에 실제 메모리에는 변화가 없다.
1. scope관점
scope 는 변수에 접근할 수 있는 범위 (변수를 찾기 위한 규칙)
1) function scope (var)
일반함수에서 선언된 var는 그 함수 코드전체가 스코프 범위이다.
전역변수를 남발할 가능성이 높음
전역변수가 나쁜거야?
나쁘다고 단정짓기 보다는 대부분의 문제시작이 전역변수에서 발생함. 간단한 앱의 경우 사용이 편리하다는 강점이 있지만 불가피한 상황을 빼고는 사용을 자제해야한다.
전역변수는 scope(유효범위)가 넓어서 시작과 끝을 구분하기 어려우며 비순수함수에 의해 변경되어 코드의 복잡성을 높일 수 있다.
=> 결론 : 변수의 scope는 좁을수록 좋다.
이러한 var의 단점을 보완해 ES6는 let과 const를 도입하였다.
2) Block scope (const , let)
block scope내에서 스스로 선언하고 자신의 코드 유효범위 내에서 사용 가능하다.
즉, 지역변수이다.
{}대괄호 단위로 범위를 지정한다
2. 호이스팅 관점
const, let => hosting X
var => hosting O
3. 재선언 가능?
const, let => 재선언 불가능
const => 재할당 불가능
let => 재할당 가능
var => 재선언 가능