ν‹°μŠ€ν† λ¦¬ λ·°

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

ES5κΉŒμ§€ λ³€μˆ˜λ₯Ό μ„ μ–Έν•  수 μžˆλŠ” μœ μΌν•œ 방법은 var ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒκ³Ό 같은 var ν‚€μ›Œλ“œμ˜ λ…νŠΉν•œ νŠΉμ§•λ“€μ€ 주의λ₯Ό κΈ°μšΈμ΄μ§€ μ•ŠμœΌλ©΄ μ‹¬κ°ν•œ 문제λ₯Ό λ°œμƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

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

 

var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” 쀑볡 선언이 κ°€λŠ₯ν•΄μ„œ μ˜λ„μΉ˜ μ•Šκ²Œ λ¨Όμ € μ„ μ–Έλœ λ³€μˆ˜μ˜ 값이 λ³€κ²½λ˜λŠ” λΆ€μž‘μš©μ΄ λ°œμƒν•©λ‹ˆλ‹€.

var x = 1;
var y = 1;

// var ν‚€μ›Œλ“œκ°€ μ—†λŠ” κ²ƒμ²˜λŸΌ λ™μž‘
var x = 100;

// μ΄ˆκΈ°ν™”λ¬Έμ΄ μ—†λŠ” λ³€μˆ˜ 선언문은 λ¬΄μ‹œλ¨
var y;

console.log(x); // 100
console.log(y); // 1
  • x와 yκ°€ 쀑볡 선언됨
  • xλŠ” μ΄ˆκΈ°ν™”λ¬Έμ΄ μžˆμ–΄μ„œ var ν‚€μ›Œλ“œκ°€ μ—†λŠ” κ²ƒμ²˜λŸΌ λ™μž‘ν•΄ 100으둜 값이 변경됨
  • yλŠ” μ΄ˆκΈ°ν™”λ¬Έμ΄ μ—†μ–΄μ„œ λ³€μˆ˜ 선언문이 λ¬΄μ‹œλ˜κ³  μ—λŸ¬λŠ” λ°œμƒν•˜μ§€ μ•ŠμŒ

 

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

  • var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ˜€λ‘œμ§€ ν•¨μˆ˜μ˜ μ½”λ“œ λΈ”λ‘λ§Œμ„ 지역 μŠ€μ½”ν”„λ‘œ 인정
  • ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ½”λ“œ 블둝 λ‚΄μ—μ„œ 선언해도 λͺ¨λ‘ μ „μ—­ λ³€μˆ˜
  • for λ¬Έ, if 문의 λ³€μˆ˜ μ„ μ–Έλ¬Έμ—μ„œ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•˜λ©΄ μ „μ—°λ³€μˆ˜

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

  • var ν‚€μ›Œλ“œλ‘œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄ λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•΄ λ³€μˆ˜ μ„ μ–Έλ¬Έ 이전에 μ°Έμ‘°κ°€ κ°€λŠ₯해짐
  • μ΄λŠ” ν”„λ‘œκ·Έλž¨ 흐름상 λ§žμ§€ μ•Šκ³  가독성을 λ–¨μ–΄λœ¨λ¦¬κ³  였λ₯˜ λ°œμƒ 여지λ₯Ό 쀌

μ΄λŸ¬ν•œ var의 단점을 λ³΄μ™„ν•˜κΈ° μœ„ν•΄ ES6μ—μ„œ letκ³Ό constλ₯Ό λ„μž…λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

 

let ν‚€μ›Œλ“œ

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

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

let bar = 123;

let bar = 456; // SyntaxError

 

 

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

λͺ¨λ“  μ½”λ“œ 블둝(ν•¨μˆ˜, ifλ¬Έ, forλ¬Έ, whileλ¬Έ, try/catchλ¬Έ λ“±)을 지역 μŠ€μ½”ν”„λ‘œ μΈμ •ν•˜λŠ” 블둝 레벨 μŠ€μ½”ν”„λ₯Ό λ”°λ¦…λ‹ˆλ‹€.

let foo = 1; // μ „μ—­ λ³€μˆ˜

{
    let foo = 2; // 지역 λ³€μˆ˜
    let bar = 3; // 지역 λ³€μˆ˜
}

console.log(foo); // 1
console.log(bar); // ReferenceError

 

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

var ν‚€μ›Œλ“œμ™€ 달리 let ν‚€μ›Œλ“œλŠ” λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ” κ²ƒμ²˜λŸΌ λ™μž‘ν•©λ‹ˆλ‹€.

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

let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” "μ„ μ–Έ 단계"와 "μ΄ˆκΈ°ν™” 단계"κ°€ λΆ„λ¦¬λ˜μ–΄ μ§„ν–‰λ˜μ–΄ μœ„μ˜ μ˜ˆμ œμ™€ 같이 *μΌμ‹œμ  μ‚¬κ°μ§€λŒ€μ—μ„œ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λ©΄ μ—λŸ¬κ°€ λ°œμƒλ©λ‹ˆλ‹€.

 

*μΌμ‹œμ  μ‚¬κ°μ§€λŒ€(DTZ) : μŠ€μ½”ν”„μ˜ μ‹œμž‘ 지점뢀터 μ΄ˆκΈ°ν™” μ§€μ κΉŒμ§€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μ—†λŠ” ꡬ간

 

let foo = 1; // μ „μ—­ λ³€μˆ˜

{
    console.log(foo); // ReferenceError
    let foo = 2; // 지역 λ³€μˆ˜
}

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

 

μ „μ—­ 객체와 let

λΈŒλΌμš°μ € ν™˜κ²½μ—μ„œ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜λŠ” μ „μ—­ 객체 window의 ν”„λ‘œνΌν‹°κ°€ λ˜λŠ” 반면, let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ „μ—­ 객체의 ν”„λ‘œνΌν‹°κ°€ μ•„λ‹™λ‹ˆλ‹€. λ”°λΌμ„œ window둜 μ ‘κ·Όν•  수 μ—†μŠ΅λ‹ˆλ‹€.

let x = 1;

console.log(window.x); // undefined
console.log(x); // 1

var y = 2;

console.log(window.y); // 2
console.log(y); // 2

 

 

const ν‚€μ›Œλ“œ

일반적으둜 *μƒμˆ˜λ₯Ό μ„ μ–Έν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” ν‚€μ›Œλ“œλ‘œ let ν‚€μ›Œλ“œμ™€ νŠΉμ§•μ΄ λŒ€λΆ€λΆ„ λ™μΌν•˜μ§€λ§Œ λͺ‡κ°€μ§€ 차이점이 μžˆμŠ΅λ‹ˆλ‹€.

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

 *μƒμˆ˜ : μž¬ν• λ‹Ήμ΄ κΈˆμ§€λœ λ³€μˆ˜. μƒνƒœ μœ μ§€, 가독성, μœ μ§€λ³΄μˆ˜μ˜ 편의λ₯Ό μœ„ν•΄ 적극 μ‚¬μš©ν•΄μ•Όν•¨

 

ν•˜μ§€λ§Œ, const ν‚€μ›Œλ“œλŠ” μž¬ν• λ‹Ήμ„ κΈˆμ§€ν•  뿐 "λΆˆλ³€"을 μ˜λ―Έν•˜μ§€λŠ” μ•Šμ•„μ„œ 객체λ₯Ό ν• λ‹Ήν•œ κ²½μš°μ—” 없을 λ³€κ²½ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

const person = {
    name: 'Lee'
};

person.name = 'Kim';

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

 

var vs. let vs. const

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

const ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ μ˜λ„μΉ˜ μ•Šμ€ μž¬ν• λ‹Ήμ„ λ°©μ§€ν•˜κΈ° λ•Œλ¬Έμ— μ’€ 더 μ•ˆμ „ν•©λ‹ˆλ‹€.

 

var와 let, const ν‚€μ›Œλ“œλŠ” λ‹€μŒκ³Ό 같이 μ‚¬μš©ν•˜λŠ” 것을 ꢌμž₯ν•©λ‹ˆλ‹€.

  • ES6을 μ‚¬μš©ν•œλ‹€λ©΄ varν‚€μ›Œλ“œλŠ” μ‚¬μš©X
  • μž¬ν• λ‹Ήμ΄ ν•„μš”ν•œ κ²½μš°μ— ν•œμ •ν•΄ let ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©. μ΄λ•Œ λ³€μˆ˜μ˜ μŠ€μ½”ν”„λŠ” μ΅œλŒ€ν•œ 쒁게 λ§Œλ“¦
  • 변경이 λ°œμƒν•˜μ§€ μ•Šκ³  읽기 μ „μš©μœΌλ‘œ μ‚¬μš©ν•˜λŠ” μ›μ‹œ κ°’κ³Ό κ°μ²΄μ—λŠ” const ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©
  • const ν‚€μ›Œλ“œλŠ” μž¬ν• λ‹Ήμ„ κΈˆμ§€ν•˜λ―€λ‘œ var, let ν‚€μ›Œλ“œλ³΄λ‹€ μ•ˆμ ν•¨

 

 

 

[좜처] λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive

https://wikibook.co.kr/mjs/

 

λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive: μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κΈ°λ³Έ κ°œλ…κ³Ό λ™μž‘ 원리

269개의 κ·Έλ¦Όκ³Ό 원리λ₯Ό νŒŒν—€μΉ˜λŠ” μ„€λͺ…μœΌλ‘œ ‘μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κΈ°λ³Έ κ°œλ…κ³Ό λ™μž‘ 원리’λ₯Ό μ΄ν•΄ν•˜μž! μ›ΉνŽ˜μ΄μ§€μ˜ λ‹¨μˆœν•œ 보쑰 κΈ°λŠ₯을 μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ μ œν•œμ μΈ μš©λ„λ‘œ νƒœμ–΄λ‚œ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 과도

wikibook.co.kr