[JS]let, const, var

2024. 12. 30. 16:23·Language/JavaScript

var

1. 스코프
var로 선언된 변수는 함수 스코프를 가진다. 즉, 변수가 선언된 함수 내에서만 접근할 수 있으며, 함수 외부에서는 접근할 수 없다. 다만, var는 블록 스코프를 지원하지 않기 때문에 if문이나 for문과 같은 블록 내에서 선언된 변수는 블록 외부에서 접근할 수 있다.
2. 호이스팅
var 변수는 호이스팅(hoisting)에 의해 선언이 스코프의 최상단으로 끌어올려지며, 초기값으로 undefined가 설정된다. 즉, 선언 전에 변수를 참조하더라도 "undefined"를 반환하며, "ReferenceError"는 발생하지 않는다.
3. 재선언
같은 스코프 내에서 여러 번 선언할 수 있다. 이는 코드의 가독성을 떨어뜨릴 수 있으며, 기존 변수를 덮어쓰기 때문에 의도하지 않은 오류를 발생시킬 가능성이 있다.
4. 재할당
var로 선언된 변수는 언제든지 값을 변경할 수 있다. 즉, 변수에 새로운 값을 할당할 수 있으며, 이는 코드의 유연성을 높여준다.

function example() {
    console.log(a); //undefined(호이스팅 발생)
    var a = 10; //선언 및 초기화
    console.log(a); //10

    if (true) {
        var a = 20; //같은 함수 스코프 내에서 재선언
        console.log(a); //20
    }
    console.log(a); //20
}
example();

if (true) {
    var x = 20; 
}
console.log(x); //블록 스코프가 아닌 함수 스코프이기 때문에 가능

let

1. 스코프
let으로 선언된 변수는 블록 스코프를 가진다. 즉, 변수가 선언된 블록 내에서만 접근할 수 있으며, 블록 외부에서는 접근할 수 없다.
2. 호이스팅
let 변수는 호이스팅(hoisting)에 의해 선언이 스코프의 최상단으로 끌어올려지지만, 초기화는 선언문에 도달했을 때 이루어진다. 초기화되기 전까지는 TDZ(Temporal Dead Zone)에 놓이게 되어, 변수를 참조하면 "ReferenceError"가 발생한다.
3. 재선언
같은 스코프 내에서 let 변수는 재선언할 수 없다. 이는 변수 중복 선언으로 인한 혼란과 의도치 않은 오류를 방지하여 코드의 명확성과 유지보수성을 높이기 위한 설계이다.

4. 재할당
let으로 선언된 변수는 언제든지 값을 변경할 수 있다. 즉, 변수에 새로운 값을 할당할 수 있으며, 이는 코드의 유연성을 높여준다.

function example() {
    console.log(b); //ReferenceError: Cannot access 'b' before initialization (TDZ)
    let b = 10; //선언 및 초기화
    console.log(b); //10

    if (true) {
        let b = 20; //다른 블록 내에서 선언된 b
        console.log(b); //20
    }
    console.log(b); //10(블록 스코프 덕분에 값이 유지됨)
}
example();

const

1. 스코프
const로 선언된 변수는 블록 스코프를 가진다. let과 마찬가지로, 변수가 선언된 블록 내에서만 접근할 수 있다.
2. 호이스팅
const 변수는 호이스팅(hoisting)에 의해 선언이 스코프의 최상단으로 끌어올려지지만, 초기화는 선언문에 도달했을 때 이루어진다. 초기화 이전에 참조하면, let과 마찬가지로 TDZ(Temporal Dead Zone)에 의해 "ReferenceError"가 발생한다.
3. 재선언
같은 스코프 내에서 재선언할 수 없다. 이는 변수의 중복 선언으로 인한 오류를 방지한다.
4. 재할당
const로 선언된 변수는 한 번 할당된 값을 변경할 수 없다. 하지만 객체나 배열과 같은 참조형 데이터의 내부 속성은 변경할 수 있다.

function example() {
    console.log(c); //ReferenceError: Cannot access 'c' before initialization (TDZ)
    const c = 10; //선언 및 초기화
    console.log(c); //10

    if (true) {
        const c = 20; //다른 블록 내에서 선언된 c
        console.log(c); //20
    }
    console.log(c); //10
    
    // c = 30; // TypeError: Assignment to constant variable. (재할당 불가)

    const obj = { a: 1 };
    obj.a = 2; //가능(객체 내부 속성 변경)
    console.log(obj); //{ a: 2 }
    const arr = [1, 2, 3];
    arr.push(4); //가능(배열 요소 추가)
    console.log(arr); //[1, 2, 3, 4]
}
example();

정리

특성 var let const
스코프 함수 스코프 블록 스코프 블록 스코프
호이스팅 선언과 초기화가 호이스팅 선언만 호이스팅 선언만 호이스팅
재선언 가능 불가능 불가능
재할당 가능 가능 불가능, 객체나 배열의 내부 속성은 변경 가능

 

'Language > JavaScript' 카테고리의 다른 글

[JS]apply, call 메서드  (0) 2025.01.13
[JS]arguments 객체  (0) 2025.01.10
[JS]템플릿 리터럴(Template Literal)  (1) 2024.12.24
[JS]객체(Object) 정의, 호출  (0) 2024.12.24
[JS]배열 관련 함수  (2) 2024.11.25
'Language/JavaScript' 카테고리의 다른 글
  • [JS]apply, call 메서드
  • [JS]arguments 객체
  • [JS]템플릿 리터럴(Template Literal)
  • [JS]객체(Object) 정의, 호출
yxxjxxeee
yxxjxxeee
  • yxxjxxeee
    공부 일지
    yxxjxxeee
  • 전체
    오늘
    어제
    • study N
      • Framework
        • Spring
      • Language
        • JavaScript
        • C | C++
        • JAVA
        • PHP
      • CS
        • 네트워크
        • 자료구조
        • 데이터베이스
        • 운영체제
      • DBMS
        • MySQL
      • 코딩테스트 N
        • 백준 N
        • 프로그래머스
        • LeetCode
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 쇼핑몰 제작 프로젝트(PHP)
    • github
  • 공지사항

  • 인기 글

  • 최근 글

  • hELLO Designed By 정상우
    Version v4.10.2
yxxjxxeee
[JS]let, const, var
상단으로

티스토리툴바