λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
javascript/πŸ“– study

[2μ£Όμ°¨ μŠ€ν„°λ””]15μž₯-let const 블둝 μŠ€μ½”ν”„

by HomieKim 2022. 2. 6.

let, const ν‚€μ›Œλ“œμ™€ 블둝 레벨 μŠ€μ½”ν”„

var ν‚€μ›Œλ“œ λ³€μˆ˜ 문제점

쀑볡선언 ν—ˆμš©

ν•¨μˆ˜λ ˆλ²¨ μŠ€μ½”ν”„

  • var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ˜€λ‘œμ§€ ν•¨μˆ˜ μŠ€μ½”ν”„ λ‚΄μ—μ„œλ§Œ 지역 μŠ€μ½”ν”„λ‘œ 인정 λ©λ‹ˆλ‹€.
var x = 1;

if (true) {
  // xλŠ” μ „μ—­ λ³€μˆ˜λ‹€. 이미 μ„ μ–Έλœ μ „μ—­ λ³€μˆ˜ xκ°€ μžˆμœΌλ―€λ‘œ x λ³€μˆ˜λŠ” 쀑볡 μ„ μ–Έλœλ‹€.
  // μ΄λŠ” μ˜λ„μΉ˜ μ•Šκ²Œ λ³€μˆ˜κ°’μ΄ λ³€κ²½λ˜λŠ” λΆ€μž‘μš©μ„ λ°œμƒμ‹œν‚¨λ‹€.
  var x = 10;
}

console.log(x); // 10

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

  • var ν‚€μ›Œλ“œ μ΄μš©μ‹œ ν˜Έμ΄μŠ€νŒ…μ— μ˜ν•΄ ν• λ‹Ή 이전에 μ°Έμ‘° κ°€λŠ₯
// 이 μ‹œμ μ—λŠ” λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ— μ˜ν•΄ 이미 foo λ³€μˆ˜κ°€ μ„ μ–Έλ˜μ—ˆλ‹€(1. μ„ μ–Έ 단계)
// λ³€μˆ˜ fooλŠ” undefined둜 μ΄ˆκΈ°ν™”λœλ‹€. (2. μ΄ˆκΈ°ν™” 단계)
console.log(foo); // undefined

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

console.log(foo); // 123

// λ³€μˆ˜ 선언은 λŸ°νƒ€μž„ 이전에 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ μ•”λ¬΅μ μœΌλ‘œ μ‹€ν–‰λœλ‹€.
var foo;

let ν‚€μ›Œλ“œ

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

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

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

  • let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λͺ¨λ“  μ½”λ“œλΈ”λ‘ 을 지역 μŠ€μ½”ν”„λ‘œ μΈμ •ν•©λ‹ˆλ‹€.
  • ν•¨μˆ˜ λ‚΄μ˜ μ½”λ“œ 블둝은 ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„μ— 쀑첩 λ©λ‹ˆλ‹€.

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

  • let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ” κ²ƒμ²˜λŸΌ λ™μž‘ν•©λ‹ˆλ‹€.
console.log(foo); // ReferenceError: foo is not defined
let foo;
  • let으둜 μ„ μ–Έν•œ λ³€μˆ˜λŠ” 선언단계와 μ΄ˆκΈ°ν™”λ‹¨κ³„κ°€ λΆ„λ¦¬λ˜μ–΄ 진행 λ©λ‹ˆλ‹€.

    varλŠ” λŸ°νƒ€μž„ 이전에 μ„ μ–Έλ˜κ³  undefined둜 ν• λ‹Ή 됨

  • λŸ°νƒ€μž„ 이전에 선언단계 μ‹€ν–‰λ˜μ§€λ§Œ λ³€μˆ˜ 선언문에 λ„μ°©ν–ˆμ„ λ•Œ μ΄ˆκΈ°ν™” λ©λ‹ˆλ‹€. (μ„ μ–Έλ¬Έ 이전에 μ°Έμ‘°ν•˜λ € ν•˜λ©΄ λ¬Έλ²•μ—λŸ¬)
  • letλ³€μˆ˜λŠ” μŠ€μ½”ν”„μ˜ μ‹œμž‘ 지점 λΆ€ν„° μ΄ˆκΈ°ν™” 단계 μ‹œμž‘ 지점(λ³€μˆ˜ μ„ μ–Έλ¬Έ)κΉŒμ§€ λ³€μˆ˜λ₯Ό μ°Έμ‘° ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 이 ꡬ간을 μΌμ‹œμ  μ‚¬κ°μ§€λŒ€(TDZ : Temporal Dead Zone)이라고 ν•©λ‹ˆλ‹€.
  • es6μ—μ„œ λ„μž…λœ let, const, classλ₯Ό μ‚¬μš©ν•œ 선언문은 ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ” 것 처럼 λ™μž‘ν•©λ‹ˆλ‹€.

    μ‹€μ œλ‘œλŠ” ν˜Έμ΄μŠ€νŒ… 되고 varλž‘ μ°¨μ΄λŠ” μœ„μ—μ„œ λ§ν•œ μ„ μ–Έ ,μ΄ˆκΈ°ν™” 뢄리와 TDZ

μ „μ—­ 객체와 let

  • let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜λŠ” var와 달리 μ „μ—­ 객체의 ν”„λ‘œνΌν‹°κ°€ μ••λ‹ˆλ‹€.
  • letμ „μ—­ λ³€μˆ˜λŠ” 보이지 μ•ŠλŠ” κ°œλ…μ μΈ 블둝 (μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ 선언적 ν™˜κ²½ λ ˆμ½”λ“œ) 내에 μ‘΄μž¬ν•˜κ²Œ λ©λ‹ˆλ‹€.

const ν‚€μ›Œλ“œ

  • letκ³Ό λ™μž‘μ„ λΉ„μŠ·ν•˜κ²Œ ν•˜λ‚˜ 차이가 μžˆμŠ΅λ‹ˆλ‹€.

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

  • const둜 μ„ μ–Έν•œ λ³€μˆ˜λŠ” λ°˜λ“œμ‹œ μ„ μ–Έκ³Ό λ™μ‹œμ— μ΄ˆκΈ°ν™” ν•΄μ•Όν•©λ‹ˆλ‹€.
  • μ΄ˆκΈ°ν™” 경우 let처럼 블둝 레벨 μŠ€μ½”ν”„λ₯Ό 가지며 ν˜Έμ΄μŠ€νŒ… λ°œμƒν•˜μ§€ μ•ŠλŠ” κ²ƒμ²˜λŸΌ λ™μž‘

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

  • const λ³€μˆ˜λŠ” μž¬ν• λ‹Ήμ΄ κΈˆμ§€λœλ‹€.
  • μ΄λŸ¬ν•œ κ·œμΉ™μ„ μ‚¬μš©ν•΄ μƒμˆ˜λ₯Ό ν‘œν˜„ν•˜λŠ”λ° μ‚¬μš©ν•©λ‹ˆλ‹€

    μƒμˆ˜λž€ μž¬ν• λ‹Ήμ΄ κΈˆμ§€λœ λ³€μˆ˜λ₯Ό λ§ν•©λ‹ˆλ‹€.

  • constλ³€μˆ˜μ— μ›μ‹œκ°’μ„ λ„£μœΌλ©΄ 변경이 λΆˆκ°€λŠ₯ ν•©λ‹ˆλ‹€

    μ›μ‹œ 값은 변경이 λΆˆκ°€λŠ₯ν•œ 값이고 const μ‚¬μš©μ‹œ λ³€μˆ˜μ˜ μž¬ν• λ‹Ήμ΄ λΆˆκ°€λŠ₯ ν•˜κΈ° λ•Œλ¬Έ

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

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

정리

  • λ³€μˆ˜ μ„ μ–Έμ—λŠ” 기본적으둜 const μ‚¬μš©, μž¬ν• λ‹Ήμ΄ ν•„μš”ν•œ κ²½μš°μ—λ§Œ let μ‚¬μš©
  • varλŠ” μ‚¬μš© x
  • λ³€μˆ˜μ˜ μŠ€μ½”ν”„λŠ” μ΅œλŒ€ν•œ 쒁게 λ§Œλ“€μ–΄μ•Ό 함

λŒ“κΈ€