var, let, const 차이점
var
, let
은 변수 선언시 초기 값을 주지 않아도 되지만 const
는 반드시 초기값을 할당해야 합니다.var
는 function-level scope
이고, let
,const
는 block-level scoped
이다.그럼 function-level scope 와 block-level scoped 를 알아보자
var a = 1; // 전역 스코프
function print() { // 지역(함수) 스코프
var a = 111;
console.log(a);
}
print();
console.log(a);
함수 레벨 스코프(Function-level scope)
함수 내에서 선언된 변수는 함수 내에서만 유효하며 함수 외부에서는 참조할 수 없다.즉, 함수 내부에서 선언한 변수는 지역 변수이며 함수 외부에서 선언한 변수는 모두 전역 변수이다.
var a = 111;
console.log(a); // 111
{
var a = 222; //전역 변수
}
console.log(a); // 222
var
의 코드 블록 내의 변수 a는 전역 변수이다.var
키워드를 사용하여 선언한 변수는 중복 선언이 허용 된다. 단, 코드 블록 내의 변수 a는 전역변수이기 때문에 전역에서 선언된 전역 변수 a의 값 111을 새로운 값 222로 재할당하여 덮어쓴다.블록 레벨 스코프(Block-level scope)
모든 코드 블록(함수, if 문, for 문, while 문, try/catch 문 등) 내에서 선언된 변수는 코드 블록 내에서만 유효하며 코드 블록 외부에서는 참조할 수 없다. 즉, 코드 블록 내부에서 선언한 변수는 지역 변수이다.
let b = 111; // 전역 변수
{
let b = 222; // 지역 변수
let bar = 222; // 지역 변수
}
console.log(b); // 111
console.log(bar); // ReferenceError: bar is not defined
let
키워드로 선언된 변수는 블록 레벨 스코프를 따른다. 코드 블록 내에 선언된 변수 b는 블록 레벨 스코프를 갖는 지역 변수이다. 전역에서 선언된 변수 b와는 다른 별개의 변수이다.
함수 안에 있는 선언들을 모두 끌어올려서 해당 함수 유효 범위의 최상단에 선언하는 것을 말한다.
호이스팅이란
자바스크립트 함수는 실행되기 전에 함수 안에 필요한 변수값들을 모두 모아서 유효 범위의 최상단에 선언한다.
즉, 함수 내에서 아래쪽에 존재하는 내용 중 필요한 값들을 끌어올리는 것이다.
// 함수 먼저
function hello1() {
console.log('hello1');
}
hello1();
// 함수의 호출을 먼저
hello2();
function hello2() {
console.log('hello2');
}
두개의 예제는 잘 작동된다. 함수만 적용되는것이 아니라 var
를 사용한 변수도 적용된다.
age = 7;
age++;
console.log(age);
var age;