스코프 내부에 있는 변수 선언문이 스코프 유효범위 최상단 까지 끌어 올려진 것을 호이스팅이라고 한다.
사실 변수 선언뿐 아니라 var, let, const, function, function*, class 키워드를 사용해서 선언하는 모든 식별자(변수, 함수, 클래스)는 호이스팅된다. 모든 선언문은 런타임 이전 단계에서 먼저 실행이 되기때문이다.
undefined
값을 할당하게 된다.var
는 선언과 초기화 가 한번에 이뤄져서 undefined 값을 초기화 하기 때문에. 변수 선언문 이전에 접근해도 에러가 발생하지 않고 undefined 값이 출력이 된다. 반대로 let은 에러가 난다 const
,let
은 선언과 초기화 가 분리되어있기 때문에 변수 선언문 까지 도달해야 초기화 가 되기때문에 그전에 변수에 접근하면 참조에러가 뜬다.
이유는 Temporal Dead Zone(TDZ)라는거 때문이다 TDZ라는 구간 있는 변수들은 사용할수가 없습니다.let,const 는 할당하기전에 사용할수가 없습니다.(버그를 줄일수가 있다)
let age = 30;
function showAge(){
console.log(age);
}
showAge();
위쪽 코드는 문제가 없습니다,하지만 밑에 코드는 에러가 발생합니다.
let age = 30;
function showAge(){
console.log(age);
let age=20;
}
showAge();
여기서 실수하는것은 이 에러는 let의 호이스팅 문제때문에 에러가 난다 라고 생각하시는 분이 많이 계실겁니다.하지만 호이스팅은 스코프(scope) 내부에서 작동하기 때문에 이번 에러는 호이스팅 에러가 아니라는것을 알수가 있습니다. 그럼 여기서 에러 나는 이유는 뭘까요?
바로 코드console.log(age); 여기서 나오는 TDZ 이기때문입니다.
함수 스코프: 함수 내에서 만 지역변수 가 된다
if문에서 선언된 var는 밖에서도 호출이 가능하다.
let,const는 불가능하다 에러가 난다.
유일하게 함수 스코프 에서는 안된다 그것을 함수 스코프라고 알고있는게 좋다.
블록 스코프는 모든 중괄호 코드 내에서 선언 한것이면 그 중괄호 안에서 만 작용이 된다.
예)함수 if for while try/catch
같은 블록 스코프 에서만 적용이 되며 블록 스코프 밖에서는
function f(){
// Block scope
}
if(){
//Block scope
}
var말고 let쓰길 권장할것 예측가능한 결과를 낼수있고 버그를 줄일수 있습니다.