호이스팅은 함수 안에 있는 선언들을 모두 끌어올려서 해당 함수 유효 범위의 최상단에 위치하도록 하는 것.
자바스크립트 함수는 실행되기 전에 함수 안에 필요한 변수값들을 모두 모아서 유효범위 최상단에 선언한다.
- 자바스크립트의 파서(parser)가 함수 실행 전 해당 함수를 한 번 훑는다.
- 함수 안에 존재하는 변수/힘수 선언에 대한 정보를 기억하고 있다가 실행시킨다.
- 유효 범위는 함수 블록({})이다.
즉, 함수 내부의 아래쪽에 존재하는 내용 중 필요한 값들을 끌어올리는 것.
- 실제로 코드가 끌어올려지는 건 아니며, 자바스크립트 parser 내부적으로 끌어올려서 처리하는 것이다.
- 그렇기 때문에 실제 메모리에서는 변화가 없다.
var변수 선언과 함수선언문에서만 호이스팅이 발생한다.
- var변수/함수 언먼만 위로 끌어올려지며, 할당은 끌어 올려지지 않음.
- 변수와 함수 선언 이름이 같을 경우 변수 선언이 함수 선언보다 위로 끌어올려진다.
- 값이 할당되어 있지 않은 변수와 값이 할당되어 있는 함수가 같은 이름으로 선언되었을 경우, 함수 선언문이 변수를 덮어쓴다.
코드의 가독성과 유지보수를 위해 호이스팅이 일어나지 않도록 처음부터 코드를 잘 짜는 것이 좋다.
- 함수와 변수를 코드 상단부에 선언하면, 호이스팅으로 인한 스코프 꼬임 현상 방지 가능
- let과 const를 사용하자.
결론
- 호이스팅이란 함수 안에 있는 선언들을 모두 끌어올려서 해당 함수의 유효범위 최상단에 위치하도록 하는 것
호이스팅은 함수선언식일 경우와 변수 선언자로 var를 사용할 때만 발생하다.
- 호이스팅이 발생하면 스코프 꼬임 에러가 발생할 수 있기 때문에, 호이스팅이 발생하지 않도록 처음부터 코드를 잘 짜는 것이 좋음.
따라서, 함수 상단부에 변수와 함수를 선언하고, 선언자료는 let과 const를 사용하는 것이 좋다.