Front-end/Vanila JS

[JS] variables - var, let, const (scope, hoisting)

탱 'ㅅ' 2024. 4. 29. 19:12

const ⭐️ (ES6)

중복선언   재할당 
constant '상수'
never gonna updated
∴ default (always)

 

 

[JS] const인 array, object 요소 수정 가능한 이유

원시자료형 Primitive Values : 변수에 값을 직접 할당 string, number, bigint, boolean, undefined, symbol, null 📦 저장 1) 실제 값은 STACK 메모리에 저장 2) 변수는 STACK 속 데이터의 주소/위치를 바라봄 📑 복사 1)

119taeyoung.tistory.com

 

let (ES6)

중복선언 ✕  재할당 ⃝
will be updated
필요시 (sometimes) - 변수의 scope를 최대한 좁게 하여 

 

var (legacy)

중복선언 ⃝  재할당 

const, let 구분 없이 사용

자율성은 생기지만
→ 고정인 값 보호 불가
→ 고정인지 변경 예정인지 알 수 없음

never 

 


Scope 란?  유효한 참조 범위

function-level scope (var)

함수 내에서 선언된 변수는 블록 내외부에 관계없이 함수 내에서만 유효하다

함수 외부에서 참조 불가

function func() {
	if (true) {
    	var a = 'a'
        console.log(a) // 'a'
    }
    console.log(a) // 'a'
}

func()
console.log(a) // ReferenceError: a is not defined

 

block-level scope (let, const)

함수, 조건문, 반복문 등의 모든 코드 블록 내부에서 선언된 변수는 그 안에서만 유효하다

코드 블록 외부에서 참조 불가

function func() {
	if (true) {
    	const a = 'a'
        console.log(a) // 'a'
    }
    console.log(a) // ReferenceError: a is not defined
}

func()
console.log(a) // ReferenceError: a is not defined

 


Hoisting

hoist: 들어/끌어올리다

호이스팅이란? 코드가 실행되기 전에 변수/함수 선언(이름)이 로컬(유효) 범위의 최상단으로 올려지는 경우

 

var

JS 인터프리터는 변수 생성의 선언 단계와 할당 단계를 분할한다

선언 부분은 코드가 실행되기 전에 현재 범위의 맨 위로 호이스팅 되고, 초기에 undefined 값이 할당된다

즉, 초기화 되기 전에 greeting 변수를 사용할 수 있다

console.log(greeting) // undefined

var greeting // 선언 단계
greeting = "hello" // 할당 단계

 

함수

func() // hoisting test

function func() {
	console.log("hoisting test")
}

 

let, const

선언 단계만 호이스팅 되기 때문에 변수 초기에 어떤 값도 할당되지 않는다  → Reference Error

TDZ(Temporal Dead Zone): 변수를 사용할 수 없는 일시적인 비활성 상태

console.log(greeting) // Uncaught ReferenceError: Cannot access 'greeting' before initialization
/*
 *
 * TDZ (Temporal Dead Zone)
 *
 */
const greeting = "hello"

 

'Front-end > Vanila JS' 카테고리의 다른 글

[JS] Loops  (0) 2024.06.20
[JS] Math 객체  (0) 2024.05.23
[JS] CSS in JS  (0) 2024.04.25
[JS] Console 객체  (0) 2024.04.24
[JS] Events  (0) 2023.12.27