let, const

let, const

1. let

자바스크립트는 var로 모든 변수를 선언할 수 있으나, var를 이용한 변수 선언의 경우 이것이 가진 여러 특징이 다음과 같이 여러 문제를 발생시킨다.

1) 중복선언

var fruit1 = '사과'; ... var fruit1 = '배';

var는 위와 같이 변수명이 같은 변수를 여러 번 중복으로 선언해도 에러가 발생하지 않는다. 이렇게 되면, 만약 앞에서 선언한 fruit1에 중요한 정보가 담겨있을 때 프로그래머가 fruit1이라는 변수명이 앞에서 사용되었다는 사실을 잊었거나 fruit2라고 써야 할 걸 오타를 쳐서 fruit1으로 쓰더라도 코드가 에러가 나지 않고 작동을 해 틀린 결과를 내버리게 된다. 이러면 프로그래머로서는 어디서 코드를 잘못 쓴 것인지 디버깅을 하기 굉장히 어려워진다.

let은 이런 var의 단점을 보완한 변수 선언문으로, 이와 같은 경우 TypeError를 발생시킨다.

2) 지역 스코프 내에서 선언한 변수를 전역 스코프에서도 사용 가능

if (isTrue) { var fruit1 = "사과"; } console.log(fruit1);

var는 이와 같이 (if문이나 for, while문 안쪽 같은) 지역 스코프에서 선언한 변수도 마치 전역 스코프에서 선언된 변수처럼 전역 스코프에서 사용할 수 있다. 그러나 이 역시 변수명의 충돌 문제가 일어날 수 있다. 이 코드에서 var 대신 let을 쓰면 ReferenceError(선언되지 않음)가 발생한다.

3) 변수값으로 undefined를 리턴하는 경우

console.log(fruit1); var fruit1 = "사과";

이 상황은 변수를 선언해 값을 대입하기 이전에 변수를 호출한 상황으로, 프로그래머가 의도대로 코드를 썼다면 나와서는 안되는 코드이다. (의도대로 정확히 코드를 썼다면 변수선언 구문을 console.log(fruit1); 구문보다 먼저 썼어야 한다.) 그러나 자바스크립트 인터프리터 입장에서 이는 전혀 틀린 코드가 아닌데, 자바스크립트 인터프리터는 자바스크립트 코드에서 변수 및 함수 선언문을 가장 먼저 메모리에 수집(hoisting)하기 때문이다. 위 코드의 경우 자바스크립트 인터프리터 입장에서는 '선언되기 전에 변수를 호출한 상황'이 아니므로 이 코드는 에러가 발생하지 않고 작동이 되는 것이다. (console에 undefined가 출력된다.) 이처럼 var를 통한 변수 선언은 에러가 나와야 할 상황에서도 코드가 정상적으로 작동이 돼 디버깅을 어렵게 한다. (이 코드에서 var 대신 let을 쓰면 ReferenceError가 발생한다.)

2. const

- const는 let이 var와 갖는 차이점을 공유하면서 한번 선언한 다음에는 값을 변경할 수 없는 변수형이다.

- const로 객체를 선언한 경우에도 이미 선언된 객체에 속성을 추가하거나 속성의 속성값을 변경하는 것은 제한 없이 가능하다. 그러나 기존 객체를 무시하고 새로운 객체를 대입할 시 TypeError가 발생한킨다.

from http://lkwks.tistory.com/36 by ccl(A) rewrite - 2021-09-27 05:28:05