Programming/JavaScript

[λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive] 15μž₯ let, const ν‚€μ›Œλ“œμ™€ 블둝 레벨 μŠ€μ½”ν”„λž€?

yuri lee 2023. 6. 3. 17:31
λ°˜μ‘ν˜•

15.1 var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜μ˜ 문제점


15.1.1 λ³€μˆ˜ 쀑볡 μ„ μ–Έ ν—ˆμš©

var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” 쀑볡 선언이 κ°€λŠ₯ν•©λ‹ˆλ‹€. 

 

15.1.2 ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„

var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ˜€λ‘œμ§€ ν•¨μˆ˜μ˜ μ½”λ“œ λΈ”λ‘λ§Œμ„ 지역 μŠ€μ½”ν”„λ‘œ μΈμ •ν•©λ‹ˆλ‹€. ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„λŠ” μ „μ—­ λ³€μˆ˜λ₯Ό λ‚¨λ°œν•  κ°€λŠ₯성을 높이고 μ „μ—­ λ³€μˆ˜κ°€ 쀑볡 μ„ μ–Έλ˜λŠ” κ²½μš°κ°€ λ°œμƒν•©λ‹ˆλ‹€. 

 

15.1.3 λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…

var ν‚€μ›Œλ“œ λ³€μˆ˜ μ„ μ–Έ μ‹œ λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ— μ˜ν•΄ λ³€μˆ˜ 선언문이 μŠ€μ½”ν”„μ˜ μ„ λ‘λ‘œ λŒμ–΄ μ˜¬λ €μ§„ κ²ƒμ²˜λŸΌ λ™μž‘ν•©λ‹ˆλ‹€. 

// 이 μ‹œμ μ—λŠ” λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ— μ˜ν•΄ 이미 foo λ³€μˆ˜κ°€ 선언됨 (1.μ„ μ–Έ 단계)
// λ³€μˆ˜ fooλŠ” undefined둜 μ²˜κΈ°ν™” 됨 (2. μ΄ˆκΈ°ν™” 단계)
console.log(foo); // undefined

// λ³€μˆ˜μ— 값을 ν• λ‹Ή (3. ν• λ‹Ή 단계)
foo = 123;

console.log(foo); // 123
 
// λ³€μˆ˜ 선언은 λŸ°νƒ€μž„ 이전에 JS 엔진에 μ˜ν•΄ μ•”λ¬΅μ μœΌλ‘œ 싀행됨
var foo;

 

15.2  let ν‚€μ›Œλ“œ


15.2.1 λ³€μˆ˜ 쀑볡 μ„ μ–Έ κΈˆμ§€

let ν‚€μ›Œλ“œλ‘œ 이름이 같은 λ³€μˆ˜λ₯Ό 쀑볡 μ„ μ–Έν•˜λ©΄ 문법 μ—λŸ¬ SyntaxErrorκ°€ λ°œμƒν•©λ‹ˆλ‹€. 

 

15.2.2 블둝 레벨 μŠ€μ½”ν”„

var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ˜€λ‘œμ§€ ν•¨μˆ˜μ˜ μ½”λ“œ λΈ”λ‘λ§Œμ„ 지역 μŠ€μ½”ν”„λ‘œ μΈμ •ν•˜λŠ” ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„λ₯Ό λ”°λ¦…λ‹ˆλ‹€. 

 

15.2.3 λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…

var ν‚€μ›Œλ“œλ‘œ μ„ μ–΄λ‚œ λ³€μˆ˜μ™€ 달리 letν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ” κ²ƒμ²˜λŸΌ λ™μž‘ν•©λ‹ˆλ‹€. let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ„ μ–Έ 단계와 μ΄ˆκΈ°ν™” 단계가 λΆ„λ¦¬λ˜μ–΄ μ§„ν–‰λ©λ‹ˆλ‹€. 

console.log(foo)l // ReferenceError: foo is not defined
let foo;
// var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€λŠ” λŸ°νƒ€μž„ 이전에 μ„ μ–Έ, μ΄ˆκΈ°ν™” 단계가 싀행됨
// λ³€μˆ˜ μ„ μ–Έλ¬Έ 이전에 λ³€μˆ˜ μ°Έμ‘° κ°€λŠ₯
console.log(foo) // undefined
var foo
console.lof(foo) // undefined
foo = 1; // ν• λ‹Ήλ¬Έμ—μ„œ ν• λ‹Ή 단계 μ‹€ν–‰ 
console.log(foo) // 1
// λŸ°νƒ€μž„ 이전에 μ„ μ–Έλ‹¨κ²Œκ°€ μ‹€ν–‰, λ³€μˆ˜κ°€ μ΄ˆκΈ°ν™”λ„μ§€ μ•ŠμŒ
// μ΄ˆκΈ°ν™” 이전에 λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μ—†μŒ
console.log(foo) // ReferenceError
let foo // λ³€μˆ˜ μ„ μ–Έλ¬Έμ—μ„œ μ΄ˆκΈ°ν™” μ‹€ν–‰
console.lof(foo) // undefined
foo = 1; // ν• λ‹Ήλ¬Έμ—μ„œ ν• λ‹Ή 단계 μ‹€ν–‰ 
console.log(foo) // 1

 

 

ν•˜μ§€λ§Œ  let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λ„ μ—¬μ „νžˆ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜λ―€λ‘œ μ°Έμ‘° μ—λŸ¬κ°€ λ°œμƒν•©λ‹ˆλ‹€. 

let foo = 1; // μ „μ—­ λ³€μˆ˜
{
 console.log(foo); // ReferenceError
 let foo = 2;
}

 

15.2.4 μ „μ—­ 객체와 let

let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜λŠ” μ „μ—­ 객체의 ν”„λ‘œνΌν‹°κ°€ μ•„λ‹™λ‹ˆλ‹€. λ”°λΌμ„œ window.foo와 같이 μ ‘κ·Όν•  수 μ—†μŠ΅λ‹ˆλ‹€. 

 

15.3 const ν‚€μ›Œλ“œ 


const ν‚€μ›Œλ“œλŠ” μƒμˆ˜ (constant)λ₯Ό μ„ μ–Έν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€. 

 

15.3.1 μ„ μ–Έκ³Ό μ΄ˆκΈ°ν™”

const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λ°˜λ“œμ‹œ μ„ μ–Έκ³Ό λ™μ‹œμ— μ΄ˆκΈ°ν™” ν•΄μ•Ό ν•©λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ SyntaxErrorκ°€ λ°œμƒν•©λ‹ˆλ‹€. 

 

15.3.2 μž¬ν• λ‹Ή κΈˆμ§€

var λ˜λŠ” let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μž¬ν• λ‹Ήμ΄ μžμœ λ‘œμš°λ‚˜ const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” κΈˆμ§€λ©λ‹ˆλ‹€. 

 

15.3.3 μƒμˆ˜

const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜μ— μ›μ‹œ 값을 ν• λ‹Ήν•œ 경우 μ›μ‹œ 값은 λ³€κ²½ν•  수 μ—†λŠ” κ°’ (immutable value)이고 const ν‚€μ›Œλ“œμ— μ˜ν•΄ μž¬ν• λ‹Ήμ΄ κΈˆμ§€λ˜λ―€λ‘œ ν• λ‹Ήλœ 값을 λ³€κ²½ν•  수 μžˆλŠ” 방법은 μ—†μŠ΅λ‹ˆλ‹€. 

 

15.3.4 const ν‚€μ›Œλ“œμ™€ 객체 

const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜μ— 객체λ₯Ό ν• λ‹Ήν•œ 경우 값을 λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 

const person = {
  name: 'Lee'
}

// κ°μ²΄λŠ” λ³€κ²½ κ°€λŠ₯ν•œ κ°’
person.name = 'kim'

console.log(person) // {name: "Kim"}

const ν‚€μ›Œλ“œλŠ” μž¬ν• λ‹Ήμ„ κΈˆμ§€ν•  뿐 "λΆˆλ³€"을 μ˜λ―Έν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μƒˆλ‘œμš΄ 값을 μž¬ν• λ‹Ήν•˜λŠ” 것은 λΆˆκ°€λŠ₯ν•˜μ§€λ§Œ ν”„λ‘œνΌν‹° 동적 생성, μ‚­μ œ, κ°’μ˜ 변경을 톡해 객체λ₯Ό λ³€κ²½ν•˜λŠ” 것은 κ°€λŠ₯ν•©λ‹ˆλ‹€. 

 

15.4 var vs. let vs. const


λ³€μˆ˜ μ„ μ–Έμ—λŠ” 기본적으둜 constλ₯Ό μ‚¬μš©ν•˜κ³ , let은 μž¬ν• λ‹Ήμ΄ ν•„μš”ν•œ κ²½μš°μ—λ§Œ ν•œμ •ν•΄ μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. 

 

Reference: λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive
λ°˜μ‘ν˜•