var a = 1;
//전역 스코프
console.log(a); //1 출력
function num () {
var a = 2; //a를 2로 다시 선언
//지역 스코프
console.log(a); //2 출력
}
console.log(a); //함수에서 나왔으므로 1 출력
let과 const 키워드의 등장으로 블록 스코프를 형성하는 것도 가능해졌다.함수 안에 있는 선언들을 모두 끌어올려서 해당 함수 유효 범위의 최상단에 선언하는 것을 말한다.
var 변수 선언과 함수선언문에서만 호이스팅이 일어난다.var 변수/함수의 선언만 위로 끌어 올려지며, 할당은 끌어 올려지지 않는다.let/const 변수 선언과 함수표현식에서는 호이스팅이 발생하지 않는다.
var키워드와 달리let과const키워드를 사용하면 같은 식별자로 변수를 선언할 수 없다. 또한undefined로 초기화 되지 않기 때문에 선언하기 전에 변수를 사용하면 오류가 발생한다. 이 지점을 TDZ(Temporal Dead Zone)이라 부르기도 한다.
일반적인 프로그래밍 언어에서의 함수 선언과 비슷한 형식이다.
함수의 선언문을 통해 선언된 함수는 코드를 구현한 위치와 관계없이 자바스크립트의 특징인 호이스팅에 따라 브라우저가 자바스크립트를 해석할 때 맨 위로 끌어 올려진다. 따라서 호이스팅에 영향을 받는다고 할 수 있다.
function 함수명() {
구현 로직
}
유연한 자바스크립트 언어의 특징을 활용한 선언 방식이다. 이름이 없는 함수를 만들고, 변수를 선언해서 함수를 할당하는 경우를 말한다. 함수 선언문과 실행방식이나 동작방식은 동일하나, 선언과 호출 순서에 따라서 정상적으로 함수가 실행되지 않을 수 있다. 따라서 호이스팅에 영향을 받지 않는다.
let 함수명 = function () {
구현 로직
};
재선언 가능 : var
재선언 불가능 : let, const
재할당 가능 : var, let
재할당 불가능 : const
함수스코프(function) : var
블록스코프({}) : let, const
호이스팅 가능 : var, fuction
호이스팅 불가능 : let, const
사실 let, const도 내부적으로는 모두 호이스팅 된다. 그러나 자바스크립트 내부에 TDZ라는 (개념)영역이 존재하며 TDZ 영역에 존재하는 변수는 접근이 불가능한데, 실제 변수 선언이 실행되는 구문이 실행되기 전에는 const, let, class로 선언된 이름은 모두 TDZ에 존재하여 참조 에러를 발생시키는 것이다.