var
선언은 함수가 시작될 때 처리됩니다. 전역에서 선언한 변수라면 스크립트가 시작될 때 처리되죠.
함수 본문 내에서 var
로 선언한 변수는 선언 위치와 상관없이 함수 본문이 시작되는 지점에서 정의됩니다(단, 변수가 중첩 함수 내에서 정의되지 않아야 이 규칙이 적용됩니다).
따라서 아래 두 예제는 동일하게 동작합니다.
이렇게 변수가 끌어올려 지는 현상을 '호이스팅(hoisting)'이라고 부릅니다.
코드 블록은 무시되기 때문에, 아래 코드 역시 동일하게 동작합니다.
바로 위 예제에서 if (false)
블록 안 코드는 절대 실행되지 않지만, 이는 호이스팅에 전혀 영향을 주지 않습니다. if
내부의 var
는 함수 sayHi
의 시작 부분에서 처리되므로 (*)
로 표시한 줄에서 phrase
는 이미 정의가 된 상태인 것이죠.
선언은 호이스팅 되지만 할당은 호이스팅 되지 않습니다.
var 이후에 let, const 가 나오게된 이유? 호이스팅이랑 연관지어서 설명
let, const 를 쓸 때의 이점
1. 타이트한 스코프의 변수는 코드의 품질을 올려준다. 사용이 필요한 블럭안에서 적용될 수 있게 let, const 로 변수를 선언하는게 중요하다.
2. 게다가 코드가 block 에 담겨있으니 가독성이 좋고 무슨 기능을 하는지 알아보기 쉽다. 잘 나뉘어있고 알아보기 쉬우니 유지보수도 쉽다.
3. local 변수는 블럭이 끝나면 수명이 다해서 사라지니 메모리도 절약이 된다.
참고 문서
https://ko.javascript.info/var
https://ko.javascript.info/variables
https://gist.github.com/LeoHeo/7c2a2a6dbcf80becaaa1e61e90091e5d