Skip to content

Latest commit

Β 

History

History
157 lines (108 loc) Β· 6.93 KB

let_const_block_level_scope.md

File metadata and controls

157 lines (108 loc) Β· 6.93 KB

var ν‚€μ›Œλ“œμ˜ λ¬Έμ œμ μ€ 이제 μΆ©λΆ„νžˆ μ•Œμ•„κ°€κ³  μžˆλ„€μš”. 그럼 이 문제λ₯Ό μ–΄λ–»κ²Œν•˜λ©΄ 슬기둭게 ν•΄κ²°ν•  수 μžˆμ„κΉŒμš”? μ§€κΈˆκΉŒμ§€λ„ 많이 μΌκ² μ§€λ§Œ, ES6μ—μ„œ λ“±μž₯ν•œ let, constλ₯Ό 본격적으둜 λ“€μ—¬λ‹€ λ³Ό λ•Œμž…λ‹ˆλ‹€!

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

ES5κΉŒμ§€λŠ” var ν‚€μ›Œλ“œλ‘œλ§Œ λ³€μˆ˜λ₯Ό μ„ μ–Έν–ˆκ³ , μ΄λŠ” λ§Žμ€ 문제점이 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜κ°€ 가진 λ¬Έμ œμ μ€ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

  1. λ³€μˆ˜ 쀑볡 μ„ μ–Έ ν—ˆμš©
  2. ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„, function() {}
  3. λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μœΌλ‘œ λ³€μˆ˜ μ„ μ–Έλ¬Έ 이전에 μ°Έμ‘°κ°€ κ°€λŠ₯ν•˜λ©°, ν• λ‹Ήλ¬Έ 이전에 μ°Έμ‘° μ‹œ undefinedλ₯Ό λ°˜ν™˜ 4.μ „μ—­ λ³€μˆ˜, μ „μ—­ ν•¨μˆ˜, μ„ μ–Έν•˜μ§€ μ•Šμ€ λ³€μˆ˜μ— 값을 ν• λ‹Ήν•œ 암묡적 전역은 μ „μ—­ 객체 window의 ν”„λ‘œνΌν‹°μ— ν• λ‹Ή

이런 이유둜 가독성, 개발자의 μ˜λ„κ°€ νλ €μ§€κ²Œ λ˜μ—ˆκ³  κ²°κ΅­ letκ³Ό constκ°€ λ“±μž₯ν•˜κ²Œ λ©λ‹ˆλ‹€.

let

ES6에 μΆ”κ°€λœ 블둝 레벨 μŠ€μ½”ν”„μ˜ μž¬ν• λ‹Ήμ΄ κ°€λŠ₯ν•œ ν‚€μ›Œλ“œμž…λ‹ˆλ‹€.

let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” var ν‚€μ›Œλ“œλ₯Ό λŒ€μ²΄ν•  수 있으며, μ•„λž˜μ™€ 같은 νŠΉμ§•μ„ κ°–μŠ΅λ‹ˆλ‹€.

  1. λ³€μˆ˜ 쀑볡 μ„ μ–Έ κΈˆμ§€, 쀑볡 μ„ μ–Έ μ‹œ 문법 μ—λŸ¬(SyntaxError) λ°œμƒ
  2. ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„, function() {}, if λ¬Έ, for λ¬Έ, while λ¬Έ, try/catch λ¬Έ λ“±
  3. λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ” κ²ƒμ²˜λŸΌ λ™μž‘
    // 1 =====================================
    console.log(foo); // ReferenceError: foo is not defined
    
    let foo;
    console.log(foo); // undefined
    
    foo = 1;
    console.log(foo); // 1
    
    // 2 =====================================
    // μ „μ—­ λ³€μˆ˜
    let foo = 1;
    {
      console.log(foo); // ReferenceError: Cannot access 'foo' before initialization
      // 지역 λ³€μˆ˜
      let foo = 2;
    }
  4. μ „μ—­ 객체 window의 ν”„λ‘œνΌν‹°κ°€ μ•„λ‹ˆλ©° let μ „μ—­ λ³€μˆ˜λŠ” 보이지 μ•ŠλŠ” κ°œλ…μ  블둝(μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ 선언적 ν™˜κ²½ λ ˆμ½”λ“œ) 내에 쑴재

μœ μ‹¬νžˆ 보아야 ν•˜λŠ” 것은 3번 ν•­λͺ©μž…λ‹ˆλ‹€. λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€? μ•„λ‹ˆμš”, let, const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λ„ λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ€ λ°œμƒν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 내뢀적인 μ²˜λ¦¬κ°€ ν‹€λ €μš”.

자, var ν‚€μ›Œλ“œμ™€ let, const ν‚€μ›Œλ“œλŠ” λ³€μˆ˜μ˜ 생λͺ… μ£ΌκΈ°κ°€ λ‹€λ₯΄κ²Œ λ™μž‘λ©λ‹ˆλ‹€. μš°λ¦¬λŠ” λ³€μˆ˜λ₯Ό λ°°μš°λ©΄μ„œ λ³€μˆ˜ 선언에 λŒ€ν•΄ μ΄ν•΄ν•˜κ³  μžˆμ„ν…Œμ§€λ§Œ, ν•œ 번 더 μƒκ°ν•΄λ³ΌκΉŒμš”?



var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λŸ°νƒ€μž„ 이전에 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ μ•”λ¬΅μ μœΌλ‘œ μ„ μ–Έ 단계와 μ΄ˆκΈ°ν™” 단계가 λ™μ‹œμ— μ§„ν–‰λ©λ‹ˆλ‹€. 예제둜 이해 ν•΄λ΄…μ‹œλ‹€.

/**
 * var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λŸ°νƒ€μž„ 이전에
 * μ„ μ–Έ 및 μ΄ˆκΈ°ν™” 단계가 μ‹€ν–‰λ©λ‹ˆλ‹€.
 * λ”°λΌμ„œ λ³€μˆ˜ μ„ μ–Έλ¬Έ 이전에 λ³€μˆ˜ μ°Έμ‘°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
 */
console.log(foo); // undefined

var foo;
console.log(foo); // undefined
// ν• λ‹Ήλ¬Έμ—μ„œ ν• λ‹Ή 단계가 μ‹€ν–‰λ©λ‹ˆλ‹€.
foo = 1;
console.log(foo); // 1

반면 let, const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ„ μ–Έ 단계와 μ΄ˆκΈ°ν™” 단계가 λΆ„λ¦¬λ˜μ–΄ μ§„ν–‰λ©λ‹ˆλ‹€.



즉, λŸ°νƒ€μž„ 이전에 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ μ•”λ¬΅μ μœΌλ‘œ μ„ μ–Έ 단계가 λ¨Όμ € μ‹€ν–‰λ˜κ³ , μ΄ˆκΈ°ν™” 단계가 λ³€μˆ˜ 선언문에 λ„λ‹¬ν–ˆμ„ λ•Œ μ‹€ν–‰λ©λ‹ˆλ‹€.

// λŸ°νƒ€μž„ 이전에 μ„ μ–Έ 단계가 μ‹€ν–‰λ˜μ§€λ§Œ λ³€μˆ˜λŠ” μ΄ˆκΈ°ν™”λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
console.log(foo); // ReferenceError: foo is not defined

let foo;
console.log(foo); // undefined

foo = 1;
console.log(foo); // 1

μ΄ˆκΈ°ν™” 단계 이전에 λ³€μˆ˜μ— μ ‘κ·Όν•˜λ €κ³  ν•˜λ©΄ μ°Έμ‘° μ—λŸ¬(Reference Error)κ°€ λ°œμƒν•˜μ£ . μ΄λ ‡κ²Œ μŠ€μ½”ν”„μ˜ μ‹œμž‘μ§€μ λΆ€ν„° μ΄ˆκΈ°ν™” μ‹œμž‘ μ§€μ κΉŒμ§€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μ—†λŠ” ꡬ간을 μΌμ‹œμ  μ‚¬κ°μ§€λŒ€(TDZ, Temporal Dead Zone) 라고 λΆ€λ¦…λ‹ˆλ‹€.

let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λ„ μ—¬μ „νžˆ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•©λ‹ˆλ‹€. μœ„μ˜ 예제λ₯Ό λ‹€μ‹œ λ³ΌκΉŒμš”?

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

λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•Šμ•˜λ‹€λ©΄, μœ„ μ½”λ“œμ—μ„œλŠ” μ „μ—­λ³€μˆ˜ foo의 값을 좜λ ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ°Έμ‘° μ—λŸ¬κ°€ λ°œμƒν–ˆμ£ ? μ΄λŠ” 지역 λ³€μˆ˜λ‘œ μ„ μ–Έν•œ fooλ₯Ό 좜λ ₯ν•˜κΈ° μœ„ν•΄ μ„ μ–Έλ¬Έ 이전에 μ ‘κ·Όν–ˆκΈ° λ–„λ¬Έμž…λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ES6에 λ„μž…λœ let, constλ₯Ό ν¬ν•¨ν•œ λͺ¨λ“  선언을 ν˜Έμ΄μŠ€νŒ…ν•˜μ§€λ§Œ, let, const,classλ§Œμ€ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ” κ²ƒμ²˜λŸΌ λ™μž‘ν•©λ‹ˆλ‹€.


const

ES6에 μΆ”κ°€λœ 블둝 레벨 μŠ€μ½”ν”„μ˜ μž¬ν• λ‹Ή λΆˆκ°€λŠ₯ν•œ μƒμˆ˜(constant)λ₯Ό μ„ μ–Έν•˜λŠ” ν‚€μ›Œλ“œμž…λ‹ˆλ‹€.

const ν‚€μ›Œλ“œλŠ” 기본적으둜 letκ³Ό λ™μΌν•˜κ²Œ λ™μž‘ν•©λ‹ˆλ‹€. λ‹€λ₯Έ 점은 λ°˜λ“œμ‹œ μ„ μ–Έκ³Ό λ™μ‹œμ— μ΄ˆκΈ°ν™”ν•΄μ•Ό ν•œλ‹€λŠ” κ²ƒμ΄μ—μš”.

const foo = 1;
foo = 2;  // TypeError: Assignment to constant variable.

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

λ³€μˆ˜λŠ” 기본적으둜 변경이 κ°€λŠ₯ν•œ 값을 λœ»ν•©λ‹ˆλ‹€. 그와 μƒλŒ€ κ°œλ…μΈ μƒμˆ˜λŠ” μž¬ν• λ‹Ήμ΄ κΈˆμ§€λœ λ³€μˆ˜λ₯Ό λœ»ν•©λ‹ˆλ‹€. μƒμˆ˜λŠ” μƒνƒœ μœ μ§€, 가독성, μœ μ§€λ³΄μˆ˜μ˜ 편의λ₯Ό μœ„ν•΄ 적극적으둜 μ‚¬μš©ν•˜κΈ°λ₯Ό ꢌμž₯ν•©λ‹ˆλ‹€. μž¬ν• λ‹Ήμ΄ κΈˆμ§€λ˜μ—ˆμœΌλ―€λ‘œ ν• λ‹Ήλœ μ΄ˆκΈ°κ°’μ„ λ³€κ²½ν•  수 μžˆλŠ” 방법은 μ—†μŠ΅λ‹ˆλ‹€.

일반적으둜 μƒμˆ˜λŠ” λŒ€λ¬Έμžλ‘œ μ„ μ–Έν•˜κ³ , μ—¬λŸ¬ λ‹¨μ–΄λ‘œ 이뀄진 경우 μ–Έλ”μŠ€μ½”μ–΄(_)둜 ꡬ뢄해 μƒμˆ˜μž„μ„ λͺ…ν™•νžˆ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. μ•„λž˜μ²˜λŸΌ 말이죠!

const TAX_RATE = 0.1;

let preTaxPrice = 100;
let afterTaxPrice = preTaxPrice + (preTaxPrice * TAX_RATE);

console.log(afterTaxPrice); // 110

μ—¬κΈ°μ„œ μ°©κ°ν•˜μ§€ 말아야 ν•  것은, const둜 μ„ μ–Έν•œ 객체의 경우, 객체 자체λ₯Ό λ³€κ²½ν•˜λŠ” 것은 κΈˆμ§€λ˜λ‚˜ 객체 λ‚΄λΆ€μ˜ 값을 λ³€κ²½ν•˜λŠ” 것은 κ°€λŠ₯ν•©λ‹ˆλ‹€. μ΄λŠ” const ν‚€μ›Œλ“œκ°€ μž¬ν• λ‹Ήμ„ κΈˆμ§€ν•˜λŠ” 것이지 λΆˆλ³€μ„ μ˜λ―Έν•˜λŠ” 것은 μ•„λ‹ˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. 즉 ν”„λ‘œνΌν‹°μ˜ 동적 생성, μ‚­μ œ, ν”„λ‘œνΌν‹° κ°’ μˆ˜μ •μ„ 톡해 객체λ₯Ό λ³€κ²½ν•˜λŠ” 것은 κ°€λŠ₯ν•˜κ²Œ λ©λ‹ˆλ‹€.

λ¬Όλ‘  객체λ₯Ό κ°€λ¦¬ν‚€λŠ” μ£Όμ†Œκ°€ 변경될 순 μ—†μŠ΅λ‹ˆλ‹€.


var vs. let vs. const

λ³€μˆ˜ 선언은 기본적으둜 constλ₯Ό μ‚¬μš©ν•˜κ³  μž¬ν• λ‹Ήμ΄ ν•„μš”ν•œ 경우만 let을 쓰도둝 ν•©μ‹œλ‹€.

ꢌμž₯μ΄μ§€λ§Œ μ—¬λŸ¬ 상황에 λŒ€ν•΄ ν†΅μš©λ˜λŠ” λ‚΄μš©μž…λ‹ˆλ‹€.

  1. ES6λ₯Ό μ‚¬μš©ν•˜λ©΄ var ν‚€μ›Œλ“œλŠ” 쓰지 μ•ŠμŠ΅λ‹ˆλ‹€.
  2. μž¬ν• λ‹Ήμ΄ ν•„μš”ν•˜λ©΄ let, κ·Έ μ™Έμ—λŠ” constλ₯Ό μ”λ‹ˆλ‹€.
  3. μ „μ—­ λ³€μˆ˜λ₯Ό λ‚¨μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.