frontEnd/javaScript

console.log("Hoisting");

Ama_grammer 2024. 12. 19. 19:15

πŸ“Œ Hoisting

- Hoisting 은 무엇인가?

JavaScript ν˜Έμ΄μŠ€νŒ…μ€ 인터프리터가 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° 전에 ν•¨μˆ˜, λ³€μˆ˜, 클래슀 λ˜λŠ”
μž„ν¬νŠΈ(import)μ˜μ„ μ–Έλ¬Έμ„ ν•΄λ‹Ή λ²”μœ„μ˜ 맨 μœ„λ‘œ λŒμ–΄μ˜¬λ¦¬λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄λŠ” ν˜„μƒμ„ λœ»ν•©λ‹ˆλ‹€.

- 좜처 : MDN

 

  • JavaScript 엔진이 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° 전에 λ³€μˆ˜μ™€ ν•¨μˆ˜ 선언을 μŠ€μ½”ν”„μ˜ μ΅œμƒλ‹¨μœΌλ‘œ λŒμ–΄μ˜¬λ¦¬λŠ” κ²ƒμ²˜λŸΌ λ™μž‘ν•˜λŠ” νŠΉμ§•μ΄λ‹€.
  • μ‹€μ œλ‘œ μ½”λ“œμ˜ μœ„μΉ˜κ°€ λ³€κ²½λ˜λŠ” 것은 μ•„λ‹ˆλ©°, λ³€μˆ˜μ™€ ν•¨μˆ˜ 선언이 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ 생성 단계 μ—μ„œ λ©”λͺ¨λ¦¬μ— λ“±λ‘λœλ‹€.
  • λ³€μˆ˜λŠ” μ„ μ–Έλ§Œ λŒμ–΄μ˜¬λ €μ§€λ©° μ΄ˆκΈ°ν™”λŠ” λŒμ–΄μ˜¬λ €μ§€μ§€ μ•ŠλŠ”λ‹€.

- Hoisting κ³Όμ •

  1. JavaScript λŠ” μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° 전에 Execution Contextλ₯Ό μƒμ„±ν•œλ‹€.
  2. μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ 생성될 λ•Œ, λ³€μˆ˜μ™€ ν•¨μˆ˜ 선언이 λ©”λͺ¨λ¦¬μ— λ¨Όμ € λ“±λ‘λœλ‹€.
  3. 이λ₯Ό 톡해 선언이 μ½”λ“œμ˜ μˆœμ„œμ™€ 관계없이 μ‚¬μš©ν•  수 있게 λ˜λ‚˜, μ΄ˆκΈ°ν™”λ‚˜ μ •μ˜λŠ” μ‹€μ œ μ½”λ“œκ°€ 싀행될 λ•Œ 이루어진닀.

⭐️  λ³€μˆ˜

- λ³€μˆ˜ μ„ μ–Έκ³Ό μ΄ˆκΈ°ν™”μ‹œ Hoisting 차이

νŠΉμ§• var let const
ν˜Έμ΄μŠ€νŒ… μ—¬λΆ€ O (ν˜Έμ΄μŠ€νŒ… 됨) O (ν˜Έμ΄μŠ€νŒ… 됨) O (ν˜Έμ΄μŠ€νŒ… 됨)
μ΄ˆκΈ°ν™” μ‹œμ  μ΄ˆκΈ°ν™”κ°€ λ™μ‹œμ— 이루어짐 μ΄ˆκΈ°ν™”λŠ” μ‹€ν–‰ λ‹¨κ³„μ—μ„œ 이루어짐
μ‚¬μš© κ°€λŠ₯ μ—¬λΆ€ (TDZ) μ„ μ–Έ 이전에도 undefined둜 μ ‘κ·Ό κ°€λŠ₯ μ„ μ–Έ 전에 μ ‘κ·Όμ‹œ ReferenceError λ°œμƒ
μŠ€μ½”ν”„ (Scope) function scope block sope
μž¬μ„ μ–Έ κ°€λŠ₯ μ—¬λΆ€ κ°€λŠ₯ λΆˆκ°€λŠ₯
μž¬ν• λ‹Ή κ°€λŠ₯ μ—¬λΆ€ κ°€λŠ₯ κ°€λŠ₯ λΆˆκ°€λŠ₯

 

∗TDZ : Temporal Dead Zone

 

- μ˜ˆμ‹œ μ½”λ“œ

console.log(a); // undefined
var a = 10;
console.log(a); // 10

console.log(b); // ReferenceError
let b = 20;

console.log(c); // ReferenceError
const c = 30;

c = 40; // Assignment to constant variable.

 


πŸ€” ν•¨μˆ˜

- ν•¨μˆ˜ μ„ μ–Έλ¬Έκ³Ό ν•¨μˆ˜ ν‘œν˜„μ‹ Hoisting 차이

  • ν•¨μˆ˜ μ„ μ–Έλ¬Έ
    • μ„ μ–Έκ³Ό μ •μ˜κ°€ λͺ¨λ‘ ν˜Έμ΄μŠ€νŒ…λœλ‹€.
    • ν•¨μˆ˜ μ„ μ–Έ 이전에도 ν˜ΈμΆœν•  수 μžˆλ‹€.
  • ν•¨μˆ˜ ν‘œν˜„μ‹
    • λ³€μˆ˜ μ„ μ–Έλ§Œ ν˜Έμ΄μŠ€νŒ…λœλ‹€.
    • μ΄ˆκΈ°ν™”λœ ν•¨μˆ˜λŠ” ν˜Έμ΄μŠ€νŒ…λ˜μ§€ μ•ŠκΈ°μ— μ„ μ–Έ 전에 ν˜ΈμΆœν•˜λ©΄ 였λ₯˜(TypeError)κ°€ λ°œμƒν•œλ‹€.

- μ˜ˆμ‹œ μ½”λ“œ

// ν•¨μˆ˜ μ„ μ–Έλ¬Έ
sayHello(); // output: Hello
function sayHello() {
  console.log("Hello");
}

// ν•¨μˆ˜ ν‘œν˜„μ‹
greet(); // TypeError: greet is not a function
let greet = function () {
  console.log("Hi");
}

 


πŸ€” class

- class μ—μ„œμ˜ hoisting

  • 클래슀 선언도 ν˜Έμ΄μŠ€νŒ…λ˜μ§€λ§Œ, let, const 와 λΉ„μŠ·ν•˜κ²Œ TDZ 에 μ˜ν•΄ μ„ μ–Έ 전에 μ ‘κ·Όν•˜λ©΄ ReferenceError κ°€ λ°œμƒν•œλ‹€.
const obj = new MyClass(); // ReferenceError
class MyClass {
  constructor() {
    this.name = "Nana";
  }
}

 


πŸ€” 문제

- Hoisting 으둜 λ°œμƒν•  수 μžˆλŠ” 문제

  • λ³€μˆ˜ 선언이 λŒμ–΄μ˜¬λ €μ§€λŠ” κ²ƒμ²˜λŸΌ λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ— μ½”λ“œ 가독성이 λ–¨μ–΄μ§ˆ 수 μžˆλ‹€.
  • undefined 값을 μ°Έμ‘°ν•˜λŠ” 버그가 λ°œμƒν•  수 μžˆλ‹€.

- Hoisting λ™μž‘ 방식 ν”Όν•˜λŠ” 방법

  1. let, const λ₯Ό μ‚¬μš©ν•˜μ—¬ TDZ λ₯Ό ν™œμš©ν•˜λ©΄ μ„ μ–Έ μ „ μ ‘κ·Ό μ‹œ μ—λŸ¬κ°€ λ°œμƒν•˜μ—¬ λ°©μ§€ ν•  수 μžˆλ‹€.
  2. λ³€μˆ˜μ™€ ν•¨μˆ˜μ„ μ–Έμ„ μ½”λ“œμ˜ μ΅œμƒλ‹¨μ— λͺ…ν™•νžˆ μž‘μ„±ν•œλ‹€.
  3. ES6 의 λͺ¨λ“ˆ μ‹œμŠ€ν…œ ν™œμš©μ‹œ μŠ€μ½”ν”„μ™€ μ„ μ–Έλ¬Έμ œκ°€ ν•΄κ²°λœλ‹€.

πŸ”₯ λ°°μš΄μ 

ν˜Έμ΄μŠ€νŒ…μ€ μ‹€ν–‰μ»¨ν…μŠ€νŠΈκ°€ 생성될 λ•Œ λ³€μˆ˜μ™€ ν•¨μˆ˜ 선언이 λ©”λͺ¨λ¦¬μ— λ¨Όμ € λ“±λ‘λ˜λ©΄μ„œ λ°œμƒν•˜λŠ”λ° 기쑴에 μ‚¬μš©ν•˜λ˜ var νŠΉμ„±μ€ μ΄ˆκΈ°ν™” 전에 ν˜ΈμΆœν•˜λ©΄ undefined λ₯Ό 좜λ ₯ν•˜λŠ”λ° μ΄λŠ” μ˜λ„μΉ˜ μ•Šμ€ 값이기 λ•Œλ¬Έμ— 문제λ₯Ό μ•ΌκΈ°ν•  수 μžˆλ‹€. 이것을 ν•΄κ²°ν•˜κΈ° μœ„ν•œ λŒ€μ²΄μ œλ‘œ let κ³Ό const κ°€ μžˆλŠ”λ° μ΄λ˜ν•œ ν˜Έμ΄μŠ€νŒ…μ΄ μ΄λ£¨μ–΄μ§€μ§€λ§Œ TDZ 둜 μ—λŸ¬λ₯Ό λ°œμƒμ‹œμΌœ 마치 ν˜Έμ΄μŠ€νŒ…μ΄ 이루어지지 μ•Šμ€ 것 처럼 보이게 ν•œλ‹€. μ—¬κΈ°μ„œ μ€‘μš” 점은 근본적으둜 let κ³Ό const 도 ν˜Έμ΄μŠ€νŒ…μ΄ μ΄λ£¨μ–΄μ§„λ‹€λŠ” 점이닀. 

상황에 따라 ν˜Έμ΄μŠ€νŒ…μ΄ μ΄λ£¨μ–΄μ§€λŠ” 것이 μ½”λ“œμ˜ μœ μ—°μ„±μ„ μ œκ³΅ν•˜κ³  μ΄ˆκΈ°ν™” μˆœμ„œμ—μ„œ 자유둜우며 ν”„λ‘œν† νƒ€μ΄ν•‘ ν•˜κΈ° μ’‹κ³  κΈ°μ‘΄ λ ˆκ±°μ‹œ μ½”λ“œμ™€μ˜ ν˜Έν™˜μ„±λ„ 쒋은 μž₯점이 μžˆμ§€λ§Œ, μ˜ˆμƒμΉ˜ λͺ»ν•œ λ™μž‘μ€ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ 잠재적 였λ₯˜λ₯Ό μ•ΌκΈ°ν•  수 있고 였λ₯˜λ₯Ό μΆ”μ ν•˜κΈ° μ–΄λ €μ›Œ 디버깅 ν•˜κΈ° μ–΄λ €μ›Œμ§€κ³  μ½”λ“œμ˜ 가독성 λ˜ν•œ μ €ν•˜μ‹œν‚€κΈ° λ•Œλ¬Έμ— ν˜Έμ΄μŠ€νŒ…μ„ λ°©μ§€ν•˜λŠ” 방식을 μ±„νƒν•˜μ—¬ 가독성과 μ•ˆμ •μ„±μ„ λ†’μ΄λŠ” 것이 μ’‹κ² λ‹€.

 

ν•™μŠ΅μ€‘μΈ λ‚΄μš©μœΌλ‘œ 잘λͺ»λœ λ‚΄μš©μ΄ μžˆλ‹€λ©΄ κΌ­ κ³ μΉ˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

μ°Έκ³ 

https://developer.mozilla.org/ko/docs/Glossary/Hoisting

 

ν˜Έμ΄μŠ€νŒ… - MDN Web Docs μš©μ–΄ 사전: μ›Ή μš©μ–΄ μ •μ˜ | MDN

JavaScript ν˜Έμ΄μŠ€νŒ…μ€ 인터프리터가 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° 전에 ν•¨μˆ˜, λ³€μˆ˜, 클래슀 λ˜λŠ” μž„ν¬νŠΈ(import)의 선언문을 ν•΄λ‹Ή λ²”μœ„μ˜ 맨 μœ„λ‘œ λŒμ–΄μ˜¬λ¦¬λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄λŠ” ν˜„μƒμ„ λœ»ν•©λ‹ˆλ‹€.

developer.mozilla.org