# Javascript : var, let, const, 스코프

- Author: @laetipark
- Published: 2024-05-08
- Updated: 2024-05-09
- Source: http://blex.me/@laetipark/javascript-var-let-const-%EC%8A%A4%EC%BD%94%ED%94%84
- Tags: javascript, let, const, scope, var

---

### var

- var(variable): 데이터 타입을 지정할 필요가 없는 변수 선언 방식
    -  함수 범위로 사용되며, 함수 또는 프로그램(전역)이 실행되면 생성되고, 종료되면 소멸되는 방식
    ```javascript
    var globalVar = "hello"; // 전역 변수

    function show(){
        var localVar = "hi"; // 지역 변수
   
        console.log(localVar); // hi
        console.log(globalVar); // hello
    }
    
    console.log(localVar); // error undefined
    console.log(globalVar); // hello
    ```
    
### let, const

- var 사용의 문제점
    - 같은 이름으로 재정의 또는 재선언이 가능하며, 마지막 값으로 받는다.
    ```javascript
    //변수 선언
    var x = "hello";
    
    // 재정의
    x = "world";
    
    // 재선언
    var x = "hello world";
    ```
    -  **함수 스코프**이기 때문에, 함수(전역) 내에 있는 동일한 변수는 재선언이 가능
    ```javascript
    var say = "hello";
    if (true) {
        var say = "hi";
    }
    
    console.log(say); // hi 
    ```
    - 변수 선언하기 전에 참조할 경우 undefined를 반환(Hoisting)
        - **Hoisting(호이스팅)**: 변수나 함수를 실행 이전(Runtime)에 미리 동작 시키거나 생성하는 것
    ```javascript
    console.log(say) // 호이스팅으로 인한 undefined 출력
    var say = "hello";
    console.log(say); // hello
    ```
- let: **가변 변수**로 재정의할 수 있지만, 재선언이 불가능
- const: **불변 변수**로 재정의하거나 재선언이 불가능
- let와 const의 특징: 블록(block) 단위 스코프

### 스코프
- 스코프: 변수가 접근할 수 있는 유효 범위
- 전역 스코프: 코드 모든 곳에서 변수를 참조할 수 있음
- 지역 스코프: 코드 특정 부분에서만 사용 가능한 변수
- 함수 스코프: 함수를 기준으로 범위가 구분
- 블록 스코프: 중괄호를 기준으로 범위가 구분
- 스코프 규칙: 바깥쪽 스코프에서 안쪽 스코프로 접근할 수 있으나, 반대로는 불가능하며, 스코프는 중첩이 가능함

- 정적 스코프(렉시컬 스코프): 함수 선언 위치에 따라 상위 스코프가 결정, javascript의 특징
- 동적 스코프: 함수 호출 위치에 따라 상위 스코프가 결정
