front-end/JavaScript

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

gaan 2023. 4. 9. 13:35

πŸ“– λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ ꡐ재) 15μž₯. let, const ν‚€μ›Œλ“œμ™€ 블둝 레벨 μŠ€μ½”ν”„

 

β€» λ³€μˆ˜ μ„ μ–Έ / ν• λ‹Ή / μ΄ˆκΈ°ν™”

 

λ³€μˆ˜ μ„ μ–Έ : λ³€μˆ˜λ₯Ό μ •μ˜ν•˜λŠ” 것

var foo;

 

λ³€μˆ˜ ν• λ‹Ή : λ³€μˆ˜κ°€ μ„ μ–Έλœ ν›„ λŒ€μž… μ—°μ‚°μž(=)λ₯Ό 톡해 값을 λ„£μ–΄μ£ΌλŠ” 것

var foo;
foo = 1;

 

λ³€μˆ˜ μ΄ˆκΈ°ν™” : λ³€μˆ˜λ₯Ό 선언함과 λ™μ‹œμ— 값을 λ„£μ–΄μ£ΌλŠ” 것

var foo = 1;

 


β€» const vs. let vs. var

κ°„λ‹¨νžˆ μ •λ¦¬ν•˜μžλ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

 

1. const

const a = b;
const a = c;
// μž¬μ„ μ–Έ κΈˆμ§€

const a = b;
a = c;
// μž¬ν• λ‹Ή κΈˆμ§€

 

2. let

let a = b;
let a = c;
// μž¬μ„ μ–Έ κΈˆμ§€

let a = b;
a = c;
// μž¬ν• λ‹Ήμ€ κ°€λŠ₯

 

3. var

var a = b;
var a = c;
a = c;
// μž¬μ„ μ–Έ, μž¬ν• λ‹Ή κ°€λŠ₯

 


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

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

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

λ”°λΌμ„œ λ³€μˆ˜λ₯Ό 쀑볡 μ„ μ–Έν•˜κ³  κ°’κΉŒμ§€ ν• λ‹Ήν–ˆλ‹€λ©΄, μ˜λ„μΉ˜ μ•Šκ²Œ λ¨Όμ € μ„ μ–Έλœ λ³€μˆ˜ 값이 λ³€κ²½λ˜λŠ” λΆ€μž‘μš©μ΄ λ°œμƒν•  수 μžˆλ‹€.

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

var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ˜€λ‘œμ§€ ν•¨μˆ˜μ˜ μ½”λ“œ λΈ”λ‘λ§Œμ„ μ§€μ—­ μŠ€μ½”ν”„λ‘œ μΈμ •ν•œλ‹€.

➑️ ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ½”λ“œ 블둝 λ‚΄μ—μ„œ 선언해도 λͺ¨λ‘ μ „μ—­ λ³€μˆ˜κ°€ λœλ‹€.

 

πŸ–₯️ μ˜ˆμ‹œ μ½”λ“œ

var x = 1;

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

console.log(x); // 10

 

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

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

var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λ³€μˆ˜ μ„ μ–Έλ¬Έ 이전에 μ°Έμ‘°ν•  수 μžˆλ‹€. (ν• λ‹Ήλ¬Έ 이전에 λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λ©΄ undefinedλ₯Ό λ°˜ν™˜ν•œλ‹€.)

 


02. let ν‚€μ›Œλ“œ

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

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

 

πŸ–₯️ μ˜ˆμ‹œ μ½”λ“œ

var foo = 123;
// var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” 같은 μŠ€μ½”ν”„ λ‚΄μ—μ„œ 쀑볡 선언을 ν—ˆμš©ν•œλ‹€.
var foo = 456;

let bar = 123;
// letμ΄λ‚˜ const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” 같은 μŠ€μ½”ν”„ λ‚΄μ—μ„œ 쀑볡 선언을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
let bar = 456; // SyntaxError

 

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

var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„(ν•¨μˆ˜μ˜ μ½”λ“œ λΈ”λ‘λ§Œμ„ μ§€μ—­ μŠ€μ½”ν”„λ‘œ 인정)λ₯Ό λ”°λ₯Έλ‹€.

let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” 블둝 레벨 μŠ€μ½”ν”„(λͺ¨λ“  μ½”λ“œ 블둝(ν•¨μˆ˜, if λ¬Έ, for λ¬Έ, while λ¬Έ, try/catch λ¬Έ λ“±))λ₯Ό λ”°λ₯Έλ‹€.

 

πŸ–₯️ μ˜ˆμ‹œ μ½”λ“œ

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

{
    let foo = 2; // μ§€μ—­ λ³€μˆ˜
    let bar = 3; // μ§€μ—­ λ³€μˆ˜
}

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

 

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

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

(* λͺ¨λ“  μ„ μ–Έ(var, let, const, function, function*, class λ“±)을 ν˜Έμ΄μŠ€νŒ…ν•˜μ§€λ§Œ, let, const, classλ₯Ό μ‚¬μš©ν•œ 선언문은 ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ” κ²ƒμ²˜λŸΌ λ™μž‘ν•œλ‹€.)

 

πŸ–₯️ μ˜ˆμ‹œ μ½”λ“œ

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

➑️ let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” "μ„ μ–Έ 단계"와 "μ΄ˆκΈ°ν™” 단계"κ°€ λΆ„λ¦¬λ˜μ–΄ μ§„ν–‰λœλ‹€. 

➑️ "μ„ μ–Έ 단계" - λŸ°νƒ€μž„ 이전 μžλ°”μŠ€ν¬λ¦½νŠΈ μ—”μ§„ λ¨Όμ € μ‹€ν–‰

➑️ "μ΄ˆκΈ°ν™” 단계" - λ³€μˆ˜ 선언문에 λ„λ‹¬ν–ˆμ„ λ•Œ μ‹€ν–‰

 

4) μ „μ—­ 객체와 let

var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—° λ³€μˆ˜μ™€ μ „μ—­ ν•¨μˆ˜, μ„ μ–Έν•˜μ§€ μ•Šμ€ λ³€μˆ˜μ— 값을 ν• λ‹Ήν•œ 암묡적 전역은 μ „μ—­ 객체 window의 ν”„λ‘œνΌν‹°κ°€ λœλ‹€.

let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ „μ—­ 객체의 ν”„λ‘œνΌν‹°κ°€ μ•„λ‹ˆλ‹€.

 


03. const ν‚€μ›Œλ“œ

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

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

 

πŸ–₯️ μ˜ˆμ‹œ μ½”λ“œ

const foo; // SyntaxError

const foo = 1;

 

 

const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ,

➑️ 블둝 레벨 μŠ€μ½”ν”„λ₯Ό κ°€μ§„λ‹€.

➑️ λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ” κ²ƒμ²˜λŸΌ λ™μž‘ν•œλ‹€.

 

πŸ–₯️ μ˜ˆμ‹œ μ½”λ“œ

{
    // λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ” κ²ƒμ²˜λŸΌ λ™μž‘ν•œλ‹€.
    console.log(foo); // ReferenceError
    const foo = 1;
    console.log(foo); // 1
}

// 블둝 레벨 μŠ€μ½”ν”„λ₯Ό κ°–λŠ”λ‹€.
console.log(foo); // ReferenceEeror

 

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

  • var / let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜ : μž¬ν• λ‹Ή μžμœ λ‘œμ›€ (*let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜ : λ³€μˆ˜ 쀑볡 선언은 κΈˆμ§€)
  • const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜ : μž¬ν• λ‹Ή κΈˆμ§€
const foo = 1;
foo = 2; // TypeError

 

3) μƒμˆ˜

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

λ³€μˆ˜ : μ–Έμ œλ“ μ§€ μž¬ν• λ‹Ήμ„ 톡해 λ³€μˆ˜ κ°’ λ³€κ²½ κ°€λŠ₯

μƒμˆ˜ : μž¬ν• λ‹Ή κΈˆμ§€

 

일반적으둜 μƒμˆ˜μ˜ 이름은 λŒ€λ¬Έμžλ‘œ μ„ μ–Έν•˜μ—¬ μƒμˆ˜μž„μ„ λͺ…ν™•νžˆ λ‚˜νƒ€λ‚Έλ‹€.

 

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

  • const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜μ— μ›μ‹œ κ°’ ν• λ‹Ή) κ°’ λ³€κ²½ X
  • const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜μ— 객체 ν• λ‹Ή) κ°’ λ³€κ²½ O

 


04. var vs. let vs. const

  • ES6을 μ‚¬μš©ν•œλ‹€λ©΄, var ν‚€μ›Œλ“œλŠ” μ‚¬μš©X
  • μž¬ν• λ‹Ήμ΄ ν•„μš”ν•œ 경우, λ³€μˆ˜μ˜ μŠ€μ½”ν”„λŠ” μ΅œλŒ€ν•œ μ’κ²Œν•˜μ—¬) let ν‚€μ›Œλ“œ μ‚¬μš©
  • 기본적으둜, 일단 const μ‚¬μš©ν•˜λŠ” 것이 μ•ˆμ „!

 

πŸ“– 참고자료

https://www.inflearn.com/course/%EB%AA%A8%EB%8D%98-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%94%A5%EB%8B%A4%EC%9D%B4%EB%B8%8C/dashboard

 

[무료] λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ λ”₯λ‹€μ΄λΈŒ μŠ€ν„°λ”” - μΈν”„λŸ° | κ°•μ˜

γ€Šλͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ λ”₯λ‹€μ΄λΈŒγ€‹ μ±… λ‚΄μš©μ„ κ·ΈλŒ€λ‘œ λ”°λΌκ°€λŠ” μŠ€ν„°λ”” μ˜μƒμž…λ‹ˆλ‹€. ν•¨κ»˜ κ³΅λΆ€ν•˜λ©΄ 훨씬 μ‰¬μ›Œμ§ˆ κ±°μ—μš”!, - κ°•μ˜ μ†Œκ°œ | μΈν”„λŸ°

www.inflearn.com