let
과 const
는 ES6가 나오면서 새롭게 추가된 기능으로 그 이전에는 변수를 선언할 때 var
키워드를 사용했다.let
, const
, var
를 사용하는 것에 어떤 차이가 있을까?var
var
을 사용할 때 발생하는 문제들이 있었기에, 새로운 방법으로 변수를 선언하는 방식이 등장한 것이다.
이를 이해하기 위해서 우선, var
에 대해 알아보자.
이 변수는 전체 window에서 접근하고 사용할 수 있다.
var greeting = 'Hello!'
console.log(greeting); // 'Hello!'
이 변수는 선언된 function내에서만 접근하고 사용할 수 있다.
function newFunction() {
var greeting = 'Hello!';
}
console.log(greeting); // ❗️Uncaught ReferenceError: hello is not defined
scope : 변수를 사용할 수 있는 범위를 뜻한다.
var
로 선언된 변수의 값은 scope 내에서 재할당될 수 있다.var greeting = 'Hello!';
greeting = 'Hi, instead.';
console.log(greeting); // 'Hi, instead.'
var
로 선언된 변수는 scope 내에서 재선언될 수도 있다.var greeting = 'Hello!';
var greeting = 'Hi, instead.';
console.log(greeting); // 'Hi, instead.'
var
의 문제같은 이름의 변수가 이미 선언되어 있는지 모르고, 다시 변수를 선언하게 되면 예상치 못한 결과가 나올 수 있다.
let
if(true) {
let greeting = 'Hello!';
console.log(greeting); // 'Hello!'
}
if(true) {
let greeting = 'Hello!';
}
console.log(greeting); // ❗️Uncaught ReferenceError: hello is not defined
let
으로 선언된 변수의 값은 scope 내에서 재할당될 수 있다.let greeting = 'Hello!';
greeting = 'Hi, instead';
console.log(greeting); // 'Hi, instead.'
let
으로 선언된 변수는 scope 내에서 재선언될 수 없다.let greeting = 'Hello!';
let greeting = 'Hi, instead.';
// ❗️Uncaught SyntaxError: Identifier 'greeting' has already been declared
하지만, 같은 이름의 변수들이 다른 scope에서 선언된다면, 에러가 발생하지 않는다.
let greeting = 'Hello!'; if(true) { let greeting = 'Hi, instead.'; console.log(greeting); // 'Hi, instead.' } console.log(greeting); // 'Hello!'
➡️ 왜냐하면 이들은 서로 다른 scope에 있으므로 다른 변수로 취급되기 때문이다.
let으로 선언한 변수는 해당 scope 내에만 존재하므로, 이전에 같은 이름의 변수를 사용했더라도 상관이 없다.
const
let
과 마찬가지로, const
로 선언된 변수는 선언된 scope내에서만 접근하고 사용할 수 있다.
const
로 선언된 변수는 상수값(constant values)을 갖으며, scope 내에서 재할당될 수 없다.const GREETING = 'Hello!';
GREETING = 'Hi, instead.';
// ❗️Uncaught TypeError: Assignment to constant variable.
const
로 선언된 변수는 scope 내에서 재선언될 수 없다.const GREETING = 'Hello!';
const GREETING = 'Hi, instead.';
// ❗️Uncaught SyntaxError: Identifier 'GREETING' has already been declared
var | let | const | |
---|---|---|---|
유효 범위 | 함수 스코프 | 블록 스코프 & 함수 스코프 | 블록 스코프 & 함수 스코프 |
값 재할당 | O | O | X |
재선언 | O | X | X |
let userName = 'wlwl99'; // O
let user_name = 'wlwl99'; // X
_
, $
, 문자
로만 시작한다.let day12 = '월요일'; // O
let _day12 = '월요일'; // O
let $day12 = '월요일'; // O
let 12day = '월요일'; // X - 숫자로 시작할 수 없다.
let @12day = '월요일'; // X - 언더바, 달러 외의 특수문자로 시작할 수 없다.
const HTML = 'Hyper Text Markup Language';
const MAX_LEVEL = '99';
var
, let
, const
, typeof
등...
const var = 10; // X - var는 변수 선언 키워드이므로 변수명으로 사용할 수 없다.
❔ 학습 후 궁금한 점
let
,const
,var
의 초기화, 선언, 할당이 어떻게 이루어지는지?- 호이스팅은 무엇이고,
let
,const
,var
의 호이스팅이 어떻게 이루어지는지?
이 글은 아래 링크를 참고하여 작성한 글입니다.
https://www.freecodecamp.org/news/var-let-and-const-whats-the-difference/
https://youtu.be/ifhnOyoMX3U