스코프
는 변수와 상수, 매개변수가 언제 어디서 정의되는지 결정한다. 이것이 어디에 선언되었는지에 따라 다른 코드가 자신을 참조할 수 있는지 결정된다.
function plus(n){
return n+n
}
plus(1) // 2
n // ReferenceError: n is not defined
// 여기서 n의 스코프는 함수 plus이다.
호이스팅
은 var로 선언한 변수의 선언문을 끌어올린다는 뜻이다. 자바스크립트는 함수나 전역 스코프 전체를 살펴보고 변수를 var로 선언하여 맨 위로 끌어올린다. 할당이 끌려올려지는 것이 아니라 선언이 끌어 올려진다는 것이 여기서 중요한 부분이다.
var a // 선언이 끌어올려진다.
a //undefined
a = 3
a //3
var로 선언된 변수와 마찬가지로 함수 선언도 스코프 맨 위로 끌어올릴 수 있다.
함수 선언식의 경우 호이스팅이 발생해서 함수를 최상단으로 끌어올려서 먼저 호출하더라도 정상적으로 동작한다.
함수 표현식의 경우 선언과 할당의 분리가 발생하여 오류가 발생한다.