μš©μ–΄μ •λ¦¬

ν˜Έμ΄μŠ€νŒ…

presentKey 2023. 11. 25. 22:10

🚩 ν˜Έμ΄μŠ€νŒ…

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

🚩  var ν˜Έμ΄μŠ€νŒ…

console.log(score); // λ³€μˆ˜ μ°Έμ‘°, undefined
var score = 7; // λ³€μˆ˜ μ„ μ–Έλ¬Έ

μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλŠ” 인터프리터에 μ˜ν•΄ ν•œ 쀄씩 순차적으둜 μ‹€ν–‰λ˜λ―€λ‘œ, scoreκ°€ μ°Έμ‘°λ˜λŠ” μ‹œμ μ—λŠ” 아직 score λ³€μˆ˜ 선언이 μ‹€ν–‰λ˜μ§€ μ•Šμ•„ μ°Έμ‘° μ—λŸ¬κ°€ μ˜ˆμƒλ©λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ°Έμ‘° μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•Šκ³  undefinedκ°€ 좜λ ₯λ©λ‹ˆλ‹€.

varλŠ” μ„ μ–Έκ³Ό μ΄ˆκΈ°ν™”κ°€ λ™μ‹œμ— μ§„ν–‰λ˜κΈ°μ— undefined둜 μ΄ˆκΈ°ν™”κ°€ μˆ˜ν–‰λœλ‹€.

κ·Έ μ΄μœ λŠ” λ³€μˆ˜ 선언이 μ†ŒμŠ€μ½”λ“œκ°€ ν•œ 쀄씩 순차적으둜 μ‹€ν–‰λ˜λŠ” μ‹œμ , 즉 λŸ°νƒ€μž„μ΄ μ•„λ‹ˆλΌ κ·Έ 이전 λ‹¨κ³„μ—μ„œ λͺ¨λ“  선언문을 μ†ŒμŠ€μ½”λ“œμ—μ„œ μ°Ύμ•„λ‚΄ λ¨Όμ € μ‹€ν–‰ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

μ†ŒμŠ€μ½”λ“œμ˜ 평가와 μ‹€ν–‰
λͺ¨λ“  μ†ŒμŠ€μ½”λ“œλŠ” 싀행에 μ•žμ„œ 평가 과정을 거치며 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•œ μ€€λΉ„λ₯Ό ν•œλ‹€. 즉 'μ†ŒμŠ€μ½”λ“œμ˜ 평가'와 'μ†ŒμŠ€μ½”λ“œμ˜ μ‹€ν–‰' κ³Όμ •μœΌλ‘œ λ‚˜λˆ„μ–΄ μ²˜λ¦¬ν•œλ‹€.

μ†ŒμŠ€μ½”λ“œ 평가: μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•˜κ³ , λͺ¨λ“  μ„ μ–Έλ¬Έλ§Œ λ¨Όμ € μ‹€ν–‰ν•˜μ—¬ μƒμ„±λœ λ³€μˆ˜λ‚˜ ν•¨μˆ˜ μ‹λ³„μžλ₯Ό ν‚€λ‘œ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ κ΄€λ¦¬ν•˜λŠ” μŠ€μ½”ν”„(λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ ν™˜κ²½ λ ˆμ½”λ“œ)에 λ“±λ‘ν•œλ‹€.

μ†ŒμŠ€μ½”λ“œ μ‹€ν–‰: 평가 과정이 λλ‚˜λ©΄ 선언문을 μ œμ™Έν•œ μ†ŒμŠ€μ½”λ“œκ°€ 순차적으둜 μ‹€ν–‰λ˜κΈ° μ‹œμž‘ν•œλ‹€.


* μ‹€ν–‰μ»¨ν…μŠ€νŠΈ: μ‹λ³„μžλ₯Ό λ“±λ‘ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” μŠ€μ½”ν”„μ™€ μ½”λ“œ μ‹€ν–‰ μˆœμ„œ 관리λ₯Ό κ΅¬ν˜„ν•œ λ‚΄λΆ€ λ©”μ»€λ‹ˆμ¦˜μœΌλ‘œ, λͺ¨λ“  μ½”λ“œλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό 톡해 μ‹€ν–‰λ˜κ³  κ΄€λ¦¬λœλ‹€.
* λ ‰μ‹œμ»¬ ν™˜κ²½: μ‹λ³„μžμ™€ μ‹λ³„μžμ— λ°”μΈλ”©λœ κ°’, 그리고 μƒμœ„ μŠ€μ½”ν”„μ— λŒ€ν•œ μ°Έμ‘°λ₯Ό κΈ°λ‘ν•˜λŠ” 자료ꡬ쑰둜 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό κ΅¬μ„±ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈ. (μ½”λ“œκ°€ μ–΄λ””μ„œ μ‹€ν–‰λ˜λ©° 주변에 μ–΄λ–€ μ½”λ“œκ°€ μžˆλŠ”μ§€)

 

μ†ŒμŠ€μ½”λ“œ 평가 κ³Όμ •μ—μ„œ λ³€μˆ˜ μ„ μ–Έλ§Œ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ κ΄€λ¦¬ν•˜λŠ” μŠ€μ½”ν”„μ— λ“±λ‘λ˜μ–΄ undefinedκ°€ 좜λ ₯λ˜μ—ˆκ³ ,

κ°’μ˜ ν• λ‹Ή(score = 7)은 μ†ŒμŠ€μ½”λ“œ μ‹€ν–‰ κ³Όμ •μ—μ„œ μ‹€ν–‰λ©λ‹ˆλ‹€.

console.log(score); // undefined
var score = 7; // λ³€μˆ˜ μ„ μ–Έ(var score)κ³Ό, κ°’μ˜ ν• λ‹Ή(score = 7)

console.log(score); // 7

즉, λ³€μˆ˜ μ„ μ–Έκ³Ό κ°’μ˜ ν• λ‹Ήμ˜ μ‹€ν–‰ μ‹œμ μ΄ λ‹€λ₯΄λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

 

이 이유둜 ν•¨μˆ˜ ν‘œν˜„μ‹κ³Ό 클래슀 ν‘œν˜„μ‹μ€ ν˜Έμ΄μŠ€νŒ… λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

ν•¨μˆ˜ μ„ μ–Έλ¬Έ, 클래슀 선언문은 ν˜Έμ΄μŠ€νŒ… λ©λ‹ˆλ‹€.
a(); // ν•¨μˆ˜ μ„ μ–Έλ¬Έ ν˜Έμ΄μŠ€νŒ…
function a() {
    console.log('ν•¨μˆ˜ μ„ μ–Έλ¬Έ ν˜Έμ΄μŠ€νŒ…')
}
// ν•¨μˆ˜ ν‘œν˜„μ‹
// Uncaught TypeError: calc is not a function
console.log(calc(10, 10));

var calc = function (a, b) {
  return a * b;
};
// 클래슀 ν‘œν˜„μ‹
// Uncaught ReferenceError: Message is not defined
var msg = new Message('hello world');   
                                
console.log(msg);

class Message {
  constructor(message) {
    this.message = message;
  }
}

 

🚩 let, const ν˜Έμ΄μŠ€νŒ…

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

 

var ν‚€μ›Œλ“œλŠ” μ„ μ–Έ 단계와 μ΄ˆκΈ°ν™” 단계가 ν•œλ²ˆμ— μ§„ν–‰λ˜μ–΄ μ°Έμ‘°μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ°,

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

 

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

// λŸ°νƒ€μž„ 이전에 μ„ μ–Έ 단계가 μ‹€ν–‰, 아직 λ³€μˆ˜ μ΄ˆκΈ°ν™”κ°€ λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.
// μΌμ‹œμ  μ‚¬κ°μ§€λŒ€μ—μ„œλŠ” λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
console.log(foo); // ReferenceError: foo is not defined

let foo; // λ³€μˆ˜ μ„ μ–Έλ¬Έμ—μ„œ μ΄ˆκΈ°ν™” 단계가 μ‹€ν–‰λ©λ‹ˆλ‹€.
console.log(foo); // undefined

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

 

let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜κ°€ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ μ•„λž˜ μ½”λ“œλŠ” μ „μ—­ λ³€μˆ˜ foo의 값을 좜λ ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€.

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

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

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

 

🚩 참고

  • λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive 4μž₯
  • λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive 23μž₯
  • λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive 15μž₯