[ JavaScript ] Hoisting

HannaΒ·2024λ…„ 7μ›” 31일
post-thumbnail

πŸ“š ν˜Έμ΄μŠ€νŒ… ( Hoisting ) μ΄λž€?

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν˜Έμ΄μŠ€νŒ…μ€ μ½”λ“œ μ‹€ν–‰ 전에 λ³€μˆ˜μ™€ ν•¨μˆ˜ 선언을 λ©”λͺ¨λ¦¬μ— λ“±λ‘ν•˜μ—¬,
μ½”λ“œ μ–΄λ””μ—μ„œλ‚˜ μ°Έμ‘°ν•  수 있게 ν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€.
사전적 μ •μ˜ : λŒμ–΄μ˜¬λ¦¬κΈ°



μš°μ„ , ν˜Έμ΄μŠ€νŒ…μ— λŒ€ν•΄ 더 μžμ„Ένžˆ μ„€λͺ…ν•˜κΈ° 전에 λ¨Όμ € μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œμ˜ λ³€μˆ˜ 처리 과정에 λŒ€ν•΄ μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

πŸ” μžλ°”μŠ€ν¬λ¦½νŠΈ λ³€μˆ˜ 처리 κ³Όμ •

  • μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” 총 3단계에 걸쳐 λ³€μˆ˜λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
    1. μ„ μ–Έ 단계 : λ³€μˆ˜λ₯Ό μƒμ„±ν•˜κ³  등둝
    2. μ΄ˆκΈ°ν™” 단계 : λ³€μˆ˜λŠ” undefined둜 μ΄ˆκΈ°ν™”
    3. ν• λ‹Ή 단계 : undefined둜 μ΄ˆκΈ°ν™”λœ λ³€μˆ˜μ— μ‹€μ œ 값을 ν• λ‹Ή

처리 단계varletconst
μ„ μ–Έλ³€μˆ˜ μ„ μ–Έκ³Ό λ™μ‹œμ— undefined둜 μ΄ˆκΈ°ν™”λ¨λ³€μˆ˜κ°€ μƒμ„±λ˜κ³  등둝됨선언과 λ™μ‹œμ— μ΄ˆκΈ°ν™” 및 κ°’ ν• λ‹Ή
μ΄ˆκΈ°ν™”-undefined둜 μ΄ˆκΈ°ν™”λ¨-
ν• λ‹Ήundefined둜 μ΄ˆκΈ°ν™”λœ λ³€μˆ˜μ— μ‹€μ œ κ°’ ν• λ‹Ήμ΄ˆκΈ°ν™”λœ λ³€μˆ˜μ— μ‹€μ œ κ°’ ν• λ‹Ήμ¦‰μ‹œ 값을 ν• λ‹Ήν•΄μ•Ό 함

μ½”λ“œ μ‹€ν–‰ μ „ λ³€μˆ˜μ™€ ν•¨μˆ˜λ₯Ό λ©”λͺ¨λ¦¬μ— μ €μž₯ν•˜κΈ° λ•Œλ¬Έμ— λ³€μˆ˜λ‚˜ ν•¨μˆ˜ 선언이 μ½”λ“œ λ‚΄ 어디에 μžˆλ”λΌλ„, μ‹€μ œ μ‹€ν–‰ 전에 λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλ˜μ–΄ μ‚¬μš©μžκ°€ 아무 문제 없이 ν•΄λ‹Ή λ³€μˆ˜λ‚˜ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 있게 λ©λ‹ˆλ‹€.



βš™οΈ ν˜Έμ΄μŠ€νŒ… λ™μž‘ 방식

  1. μžλ°”μŠ€ν¬λ¦½νŠΈ parserκ°€ ν•¨μˆ˜ μ‹€ν–‰ μ „ ν•΄λ‹Ή ν•¨μˆ˜μ „μ²΄λ₯Ό ν›‘μŠ΅λ‹ˆλ‹€.
  2. ν•¨μˆ˜ λ‚΄ μ‘΄μž¬ν•˜λŠ” λ³€μˆ˜, ν•¨μˆ˜ 선언에 λŒ€ν•œ 정보λ₯Ό κΈ°μ–΅ν•˜κ³  μ‹€ν–‰ν•©λ‹ˆλ‹€.
  3. μœ νš¨λ²”μœ„λŠ” ν•¨μˆ˜ 블둝 {} λ‚΄μ—μ„œ λ³€μˆ˜μ™€ ν•¨μˆ˜ 선언을 λΈ”λ‘μ˜ μƒλ‹¨μœΌλ‘œ λŒμ–΄μ˜¬λ¦¬λŠ” κ²ƒμž…λ‹ˆλ‹€.
  4. μ‹€μ œ μ½”λ“œκ°€ λŒμ–΄μ˜¬λ €μ§€λŠ” 것이 μ•„λ‹ˆκ³  μžλ°”μŠ€ν¬λ¦½νŠΈ parserκ°€ λ‚΄λΆ€μ μœΌλ‘œ λŒμ–΄μ˜¬λ € μ²˜λ¦¬ν•˜λŠ” κ²ƒμ΄λ―€λ‘œ μ‹€μ œ λ©”λͺ¨λ¦¬μ—μ„œλŠ” λ³€ν™”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
μ‹€μ œλ‘œ ν˜Έμ΄μŠ€νŒ…μ€ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ κ·œλ²”μ μœΌλ‘œ μ •μ˜λœ μš©μ–΄κ°€ μ•„λ‹™λ‹ˆλ‹€.
μœ„ μ„€λͺ…κ³Ό 같이 λŒμ–΄μ˜¬λ €μ§€λŠ” ν˜„μƒμ„ μ˜μ–΄λ‘œ "hoisting"이라 ν•˜μ—¬
λ§Žμ€ μ‚¬λžŒλ“€μ΄ ν˜Έμ΄μŠ€νŒ…μ΄λΌλŠ” λͺ…칭을 μ‚¬μš©ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.


πŸ“¦ var μ„ μ–Έλ¬Έ ν˜Έμ΄μŠ€νŒ…

console.log(test); //undefined

var test = 123;
console.log(test); //123

λ³€μˆ˜ testκ°€ μ„ μ–Έλ˜κΈ° 전에 μ°Έμ‘° μ‹œ μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•Šκ³  undefinedκ°€ 좜λ ₯λ©λ‹ˆλ‹€.

μ΄λŠ” μ½”λ“œ μ‹€ν–‰ 전에 μžλ°”μŠ€ν¬λ¦½νŠΈ λ‚΄λΆ€μ—μ„œ 미리
testλ³€μˆ˜λ₯Ό μ„ μ–Έν•˜μ—¬ undefined둜 μ΄ˆκΈ°ν™”λ₯Ό ν•΄λ‘μ—ˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

λ”°λΌμ„œ var ν‚€μ›Œλ“œ λ³€μˆ˜λŠ” ν˜Έμ΄μŠ€νŒ… κ³Όμ •μ—μ„œ μ„ μ–Έ 및 μ΄ˆκΈ°ν™” 단계가 λ™μ‹œμ— 진행됨을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.



πŸ“¦ let, constΒ  μ„ μ–Έλ¬ΈΒ ν˜Έμ΄μŠ€νŒ…

console.log(test); // ReferenceError: test is not defined

let test = 123;
console.log(test); // 123

같은 μƒν™©μ—μ„œ letκ³Ό const의 경우 errorλ₯Ό λ°œμƒμ‹œν‚€λŠ”λ° λ°”λ‘œ TDZ(Temporal Dead Zone) λ•Œλ¬Έμž…λ‹ˆλ‹€.

TDZλž€ μŠ€μ½”ν”„ μ‹œμž‘ μ§€μ μ—μ„œ μ΄ˆκΈ°ν™” μ‹œμž‘ μ§€μ κΉŒμ§€μ˜ μ˜μ—­μ„ μ˜λ―Έν•˜λ©°,
이 μ˜μ—­μ— μžˆλŠ” λ³€μˆ˜λ“€μ€ μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
letκ³Ό constλŠ” TDZ에 영ν–₯을 λ°›κΈ° λ•Œλ¬Έμ— 할당을 ν•˜κΈ° μ „μ—λŠ” μ‚¬μš©μ΄ λΆˆκ°€ν•©λ‹ˆλ‹€.

즉, let의 경우 μ„ μ–Έ λ‹¨κ³„κΉŒμ§€λŠ” μ™„λ£Œλ˜μ—ˆμ§€λ§Œ μ΄ˆκΈ°ν™”κ°€ λ˜μ§€ μ•Šμ•„ μ—λŸ¬κ°€ λ°œμƒν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.
μ΄λŠ” 잠재적인 버그λ₯Ό 쀄일 수 μžˆλ‹€λŠ” μž₯점이 μžˆμŠ΅λ‹ˆλ‹€.



πŸ› οΈ ν•¨μˆ˜μ„ μ–Έλ¬ΈΒ ν˜Έμ΄μŠ€νŒ…

test(); //test

function test() {
  console.log("test");
}

ν•¨μˆ˜ 호좜이 ν•¨μˆ˜μ„ μ–Έλ¬Έμ˜ μœ„μ— μžˆλ“  μ•„λž˜μͺ½μ— μžˆλ“ 
ν•¨μˆ˜ 선언문은 ν˜Έμ΄μŠ€νŒ… 영ν–₯으둜 λŒμ–΄μ˜¬λ €μ§€κΈ° λ•Œλ¬Έμ— μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.



πŸ› οΈ ν•¨μˆ˜ν‘œν˜„μ‹Β ν˜Έμ΄μŠ€νŒ…

test(); // TypeError: test is not a function

var test = function () {
  console.log("test");
};

test(); // test

ν•¨μˆ˜ ν‘œν˜„μ‹μ˜ 경우, λ³€μˆ˜ μ„ μ–Έ(var test)은 ν˜Έμ΄μŠ€νŒ…λ˜μ§€λ§Œ,
ν•¨μˆ˜μ˜ μ΄ˆκΈ°ν™”μ™€ 할당은 ν˜Έμ΄μŠ€νŒ…λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
λ”°λΌμ„œ testλ₯Ό ν˜ΈμΆœν•˜κΈ° 전에 testλŠ” undefined둜 μ΄ˆκΈ°ν™”λ˜λ©°,
이 μƒνƒœμ—μ„œ ν˜ΈμΆœν•˜λ©΄ TypeErrorκ°€ λ°œμƒν•©λ‹ˆλ‹€.
이후 test에 ν•¨μˆ˜κ°€ ν• λ‹Ήλœ 후에 ν˜ΈμΆœν•˜λ©΄ μ •μƒμ μœΌλ‘œ "test"κ°€ 좜λ ₯λ©λ‹ˆλ‹€.



profile
A Developer Who Thinks Why

0개의 λŒ“κΈ€