프로그래밍 언어/JavaScript + TypeScript

[JavaScript] 변수 선언: const, let, var 차이

2021. 2. 14. 01:18
목차
  1. const
  2.  
  3. let vs var
  4. 결론
  5.  
  6. 참고

const

const는 블록의 문맥 내에서 재할당할 수 없는 변수 선언이다. 즉, 한 번 선언하면 변경할 수 없다.

그러나 const에 할당된 값이 불변값이 되지는 않는다. 변수를 재할당할 수는 없지만, 값을 바꿀 수는 있다.

 

다음 예제를 보자. const로 선언한 배열(discountable)에 원소를 추가할 수 있다.

const discountable = [];
...
for (let i = 0; i < cart.length; i++) {
    if (cart[i].discountAvailable) {
        discountable.push(cart[i]);
    }
}

const를 통한 변수 선언의 장점을 살리기 위해선 조작(mutation)을 피하는 것이 좋다.

이를 조작이 없는 코드로 변경하면 다음과 같다.

const discountable = cart.filter(item => item.discountAvailable);

const를 사용하는 이유

값을 할당한다는 것은 단순히 정보를 선언하는 것뿐만 아니라, 무엇을 정보를 할지에 대한 신호를 보내는 것이다.

따라서 코드를 검토할 때 해당 변수를 신경 쓰지 않아도 된다는 정보를 검토자에게 알려주는 역할을 한다.

 

let vs var

ES6의 등장 이후로 변수 재할당이 이루어지는 경우엔 let을 사용한다. 

 

var은 어휘적 유효 범위(lexical scope)를 따르는 반면, let은 블록 유효 범위(block scope)를 따른다.

let과 const는 같은 유효 범위 내에서 같은 이름의 변수를 다시 선언할 수 없으나, var은 같은 유효 범위에서 같은 이름의 변수를 재선언할 수 있다.

 

var로 할당한 변수는 함수 유효 범위(엄밀히 말하자면 유효적 유효 범위)를 따른다.

즉, 함수 내에서 마지막으로 할당한 값을 참조한다.

여기서 파생되는 문제가 많기 때문에 ES6의 등장 이후로, var의 사용을 지양하고 있다.

 

간단하게 문제가 발생하는 코드를 살펴보자.

<!DOCTYPE html>
<html lang="ko">
<head>
    <title>Test</title>
</head>
<body>
    <ul style="cursor:pointer">
        <li> if clicked, print 0 </li>
        <li> if clicked, print 1 </li>
        <li> if clicked, print 2 </li>
    </ul>
</body>
<script>
    const items = document.querySelectorAll('li');
    for(var i = 0; i < items.length; i++) {
        items[i].addEventListener('click', () => {
            alert(i);
        })
    }
</script>
</html>

리스트의 요소에 따라 다른 숫자를 출력시키고자 의도했지만, 모든 요소가 동일하게 3을 출력함을 알 수 있다.

 

let은 var와 달리 블록 유효 범위를 따르므로 블록 내에서 let으로 선언한 변수는 해당 블록에서만 유효하다.

따라서 반복되어서 값이 변경된다 할지라도, 이전에 선언한 함수의 값은 변경되지 않는다.

쉽게 말하자면 let을 이용하면 for문이 반복될 때마다 값을 잠그게 된다.

 

결론

var로 할 수 있는 거의 모든 것을 let으로 대체할 수 있으므로, var을 사용하기 보다는 const와 let을 사용해야 한다.

 

참고

자바스크립트 코딩의 기술(조 모건 저)

저작자표시 비영리 (새창열림)

'프로그래밍 언어 > JavaScript + TypeScript' 카테고리의 다른 글

[스크랩] JavaScript(ES6), TypeScript, Node.js 개발자를 위한 무료 e북 4가지  (0) 2021.06.22
[You Don't Know JS] 2. 값(Value)  (0) 2021.06.22
[You Don't Know JS] 1. 타입(Type)  (0) 2021.06.21
[JavaScript] 함수 선언문 vs 함수 표현식  (0) 2021.03.23
[JavaScript] 펼침 연산자: spread operator  (0) 2021.02.17
  1. const
  2.  
  3. let vs var
  4. 결론
  5.  
  6. 참고
'프로그래밍 언어/JavaScript + TypeScript' 카테고리의 다른 글
  • [You Don't Know JS] 2. 값(Value)
  • [You Don't Know JS] 1. 타입(Type)
  • [JavaScript] 함수 선언문 vs 함수 표현식
  • [JavaScript] 펼침 연산자: spread operator
코택
코택
TaxFree코택 님의 블로그입니다.
코택
TaxFree
코택
전체
오늘
어제
  • 분류 전체보기 (369)
    • Spring (29)
      • Spring (18)
      • 스프링 핵심 원리 - 고급편 (11)
    • Spring Batch (4)
    • JPA (4)
    • CS (89)
      • 자료구조 (2)
      • 네트워크 (5)
      • 운영체제 (1)
      • 데이터베이스 (4)
      • SQL (7)
      • 알고리즘 이론 (4)
      • 알고리즘 문제 풀이 (66)
    • 웹 (28)
      • React.js (4)
      • Next.js (1)
      • Node.js (14)
      • FastAPI (4)
      • Django (5)
    • 프로그래밍 언어 (45)
      • Python (5)
      • Java + Kotlin (29)
      • JavaScript + TypeScript (11)
    • 테스트코드 (26)
      • ATDD, 클린 코드 with Spring (4)
      • 이규원의 현실 세상의 TDD: 안정감을 주는 코드.. (20)
    • 인프라 (6)
      • AWS (2)
      • Kubernetes (4)
    • 트러블슈팅 (25)
    • 책 (89)
      • Effective Java (54)
      • Effective Kotlin (14)
      • 도메인 주도 개발 시작하기: DDD 핵심 개념 정.. (11)
      • 웹 프로그래머를 위한 데이터베이스를 지탱하는 기술 (6)
      • 도메인 주도 설계 첫걸음 (4)
    • Git (10)
    • 회고 (5)
    • etc (8)

블로그 메뉴

  • 홈
  • 방명록
  • 관리
  • GitHub
  • LinkedIn

공지사항

  • 스킨 관련

인기 글

태그

  • BOJ
  • dp
  • http
  • 그래프
  • Git
  • 깊이 우선 탐색
  • 브루트포스
  • 파이썬
  • Shortest Path
  • atdd
  • 그래프 탐색
  • fastapi
  • 장고
  • mysql
  • 백준

최근 댓글

최근 글

hELLO · Designed By 정상우.
코택
[JavaScript] 변수 선언: const, let, var 차이
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.