JavaScript
변수와 호이스팅
- 변수에는
var, let, const세 가지가 있다. - 호이스팅은 선언된 변수가 최상위에 선언된 것처럼 행동하는 것을 말한다.
1
2
3
4
5
6
7
var name;
console.log(name); //undefined
name = "Mike";
let name;
console.log(name); //ReferenceError
name = "Mike";
let, const또한 호이스팅은 되지만 사용하지 못하는 이유는 Temporal Dead Zone때문이다.- TDZ는 할당을 하기 전에는 사용할 수 없는데, 이는 코드를 예측 가능하게 하고, 잠재적인 버그를 줄이기 위함이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Temporal Dead Zone
console.log(name);
// ...
let name = "Mike";
let age = 30;
function ShowAge() {
// Temporal Dead Zone
console.log(age);
// ...
let age = 20;
}
ShowAge();
변수의 생성과정
변수 생성에는 3단계를 거친다.
- 선언 단계
- 초기화 단계
- 할당 단계
var에서는 선언 및 초기화 단계가 동시에 일어나기 때문에 할당 전에 호출하면 에러가 발생하지 않고undefined가 츌력된다.let은 선언 단계와 초기화 단계가 분리되어 있어 호이스팅 되면서 선언 단계가 이루어지지만 초기화 단계는 실제 코드에 도달해서 이루어지기 때문에Reference Error가 발생한다.const는 위 3단계가 동시에 일어나기 때문에 선언과 동시에 할당을 해주어야 한다.- 따라서,
var, let은 선언은 해두고 나중에 할당하는 것이 가능하지만const는 선언과 동시에 할당을 해주어야 한다.
1
2
3
4
5
6
7
8
var name;
name = "Mike";
let age;
age = 30;
const gender; // Error
gender = "Male";
var는 함수 스코프이고,let, const는 블록 스코프이다.
1
2
3
4
5
6
7
8
9
10
11
function add(){
// block level scope
}
if(){
// block level scope
}
for(){
// block level scope
}
블록 스코프와 함수 스코프
scope: 변수에 접근할 수 있는 범위를 말하며, 새로운 함수가 생설될 때마다 새로운 스코프가 발생한다.- 선언된 블록 내부에서만 사용할 수 있는 것을 블록 스코프라고 한다.
let, const는 블록 스코프이기 때문에 선언된if문 안에서만 사용이 가능하다.
1
2
3
4
5
6
7
const age = 30;
if (age <= 30) {
var txt = "성인";
}
console.log(txt); // "성인"
- 함수 스코프는 새로운 스코프가 생성되고 함수의 블록 내부에서만 접근할 수 있다.
1
2
3
4
5
function Age() {
var age = 30;
}
console.log(age); // Reference Error
정리
var와let, const의 차이var는 함수 스코프 내부에서만 지역 변수로 유지되기 때문에, 함수를 제외한 여러문안에서 선언된 변수는 전역 변수로 취급된다.
- 스코프는 크게 전역 스코프와 지역 스코프로 나뉘며, 지역 스코프에는 함수 스코프와 블록 스코프가 있다.