티스토리 뷰
1. let, const의 차이 (var을 기준으로)
let
변수 중복 선언을 금지한다.
let 키워드로 이름이 같은 변수를 중복 선언하면 문법 에러(SyntaxError)가 발생한다.
let test = 3;
let test = 2; // SyntaxError
모든 코드 블록을 지역 스코프로 인정하는 블록 레벨 스코프다.
변수 호이스팅이 발생하지 않는 것처럼 작동한다.
변수 선언문 이전에 참조하면 참조 에러(ReferenceError)가 발생한다.
let 키워드는 선언 단계와 초기화 단계가 분리되기 때문이다.
암묵적으로 선언 단계는 먼저 실행되지만,
초기화 단계가 변수 선언문에 도달했을 때 실행되므로
참조 에러가 발생하는 것이다.
참고로
스코프 시작 지점부터 초기화 시작 지점까지를
일시적 사각지대라고 부른다.
console.log(text); // ReferenceError: text is not defined
let text;
이로 인해 호이스팅이 발생하지 않는 것처럼 보이나,
발생은 한다.
간단한 예제를 통해 판단할 수 있다.
let test = 3;
{
console.log(test); // ReferenceError
let text = 3;
}
let으로 선언한 전역 변수는 전역 객체의 프로퍼티가 아니다.
let은 개념적 블록인 환경 레코드 내에 존재하므로
windeow. 으로 접근할 수 없다.
const
상수를 선언하기 위해 사용한다.
let과 const는
var을 개선하기 위해 나왔으므로 대개의 경우 let과 동일하다.
아래는 let과 다른 점만 작성되어 있다.
반드시 선언과 동시에 초기화해야 한다.
그렇지 않으면 문법 에러가 발생한다.
const test; // SyntaxError
또한 재할당이 금지되었다.
const test = 3;
test = 2; // TypeError
단,
const 키워드로 선언된 변수에 객체를 할당한 경우에는 값을 변경할 수 있다.
원시 값은 재할당 없이 변경 불가하지만
객체는 재할당 없이 직접 변경이 가능하기 때문이다.
const character = {
age: 24
};
character.age = 23;
따라서 const의 재할당 금지는 불변을 이야기하는 것이 아니다.
2. 주된 사용처
변수 선언시
기본적으로 const를 사용하고
let은 재할당이 필요한 경우에
한정해 사용한다.
const는 의도치 않는 재할당을 방지하며
생각보다 재할당이 필요한 경우가 없기 때문이다.
단, let 키워드를 사용할 경우
변수 스코프를 최대한 좁게 만든다.
이때 const부터 사용하고
재할당이 필요한 경우에 let으로 바꾸는 방식을 취한다.
3. var 키워드는 사용해도 되는가?
다양한 문제를 발생시킬 수 있기 때문에 지양하는 것이 옳다고 본다.
var 키워드는 ES5까지 사용하다가 아래의 문제들로 인해
보완된 let과 const라는 키워드가 등장했기 때문이다.
var 키워드의 문제는 다음과 같다.
1. 변수 중복 선언 허용
2. 함수 레벨 스코프
3. 변수 호이스팅
이미 선언된 변수 이름을 잊고 중복 선언하면
의도치않게 먼저 선언한 변수 값이
에러 없이 변경될 수 있다.
더구나 함수의 코드 블록만을 지역 스코프로 인정하기 때문에
함수가 아닌 다른 코드 블록 내에서 선언한 것은
모두 전역 변수 취급이 된다.
호이스팅 역시도 마찬가지인데
var 키워드로 선언하면 변수 호이스팅에 의해
변수 선언문이 스코프의 선두로 끌어 올려진 것처럼 동작한다.
따라서 할당문 이전에 변수를 참조하면 언제나 undefined를 반환하는데
선언문 이전에 변수를 참조하는 것이 에러를 발생시키지는 않지만
프로그램 흐름상 맞지 않기 때문에 문제의 여지가 있다.
결국 쓸모있는 변수 이름을 한 번 밖에 사용하지 못할 확률이 커지므로
var 키워드는 사용을 지양하는 편이 맞다고 판단한다.
'Oops, All Code! > 📝 Study Notes' 카테고리의 다른 글
[JS] 생성자 함수 (0) | 2023.03.05 |
---|---|
[React] 한 학기 공부 계획 (0) | 2023.03.01 |
[JS] 렉시컬 스코프의 개념 (0) | 2023.01.12 |
[JS] 스코프 체인 (0) | 2023.01.10 |
[JS] 실행 컨텍스트 (0) | 2023.01.09 |
- Total
- Today
- Yesterday
- 어른의어휘공부
- 카드뉴스
- 비즈플리마켓
- 도서리뷰
- 우아한테크코스
- react
- js
- 타입좁히기
- 경험플리마켓
- 소사벌
- 카페추천
- typescript
- 어휘력
- 소사벌맛집
- 트러블슈팅
- 서평
- 코딩테스트
- 프리코스
- 책추천
- 안성스타필드
- 플리마켓운영
- 프론트엔드
- 일급객체
- javascript
- 회고
- 대학생팝업스토어
- 대학생플리마켓
- 플리마켓후기
- 프로토타입
- 도서추천
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |