과거의 자바스크립트에서는 var
를 이용해 변수를 선언하였다. 그러나 var
를 사용하게 되면 몇가지 문제 상황이 발생하여 let
, const
사용을 권하고 있다. 그렇다면, let
과 const
는 각각 어떠한 역할을 하는지 알아보자.
값이 변할 수 있는 데이터 공간. 즉, 변수를 저장할 수 있게 한다.
let age = 25;
console.log(age);
age = 30;
console.log(age);
일정한 값을 저장하는 데이터 공간. 즉, 변하지 않는 상수를 의미한다.
상수는 한번 선언된 이후, 새롭게 할당할 수 없다. 할당하고자 한다면 에러가 발생한다.
const name = '희원';
name = '예지'; // -> TypeError: "name is read-only"
그러나 객체 내에서의 변수값 변경은 가능하다. 이 내용은 이후 글에서 다루도록 하겠다.
이러한 변수를 지정하는 그 명칭에는 몇가지 규칙이 존재한다.
그렇다면 이전에 사용되었던 var
과는 어떤 차이점이 있을까?
let | const | var | |
---|---|---|---|
재선언 | X | X | O |
재할당 | O | X | O |
스코프 | 블록-레벨 | 블록-레벨 | 함수-레벨 |
호이스팅 | 불가능 | 불가능 | 가능 |
만약 재선언이 가능하다면,
1000줄이 넘는 코드에서 똑같은 이름을 가진 변수가 다시 선언되었을 경우, 에러를 보여주지 않아 문제가 발생할 수 있다.
var height = 160;
console.log(height);
var height = 180;
console.log(height);
-> 동일한 변수를 두번 선언했음에도 해당 코드는 잘 동작한다! :(
const
, let
은 블록-레벨 스코프이다.
그러나 var
는 함수-레벨 스코프이기 때문에, if문 안에서 선언된 변수도 if문 밖(블록스코프 밖)에서 접근할 수 있다.
if (true) {
var test = true;
}
alert(test); // true(if 문이 끝났어도 변수에 여전히 접근할 수 있음)
뿐만 아니라, for문에도 동일하게 작용된다.
for (var i = 0; i < 10; i++) {
// ...
}
alert(i); // 10, 반복문이 종료되었지만 'i'는 전역 변수이므로 여전히 접근 가능합니다.
이런 var
의 특징은 특정 지역변수를 전역변수화시키는 문제가 발생하게 한다.
Hoisting
(호이스팅) 이란, 변수가 최상단으로 끌어올려지는 현상을 의미한다. (hoist
는 끌어올리다라는 뜻이 있다.)
var
로 변수를 선언할 경우, 선언이 호이스팅이 되어 에러를 발생시키지 않는다.
function sayHi() {
phrase = "Hello";
alert(phrase);
var phrase;
}
sayHi();
그러나, 할당은 호이스팅되지 않기 때문에 만약 할당되기 전이라면 undefined
가 변수에 담길 것이다.
function sayHi() {
var phrase;
phrase = "Hello";
alert(phrase);
}
sayHi();