Hoisting

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

ν•¨μˆ˜ μ•ˆμ— μžˆλŠ” 선언듀을 λͺ¨λ‘ λŒμ–΄μ˜¬λ €μ„œ ν•΄λ‹Ή ν•¨μˆ˜ 유효 λ²”μœ„μ˜ μ΅œμƒλ‹¨μ— μ„ μ–Έν•˜λŠ” 것을 λ§ν•œλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜λŠ” μ‹€ν–‰λ˜κΈ° 전에 ν•¨μˆ˜ μ•ˆμ— ν•„μš”ν•œ λ³€μˆ˜ 값듀을 λͺ¨λ‘ λͺ¨μ•„μ„œ 유효 λ²”μœ„(μŠ€μ½”ν”„)의 μ΅œμƒλ‹¨μ— μ„ μ–Έν•˜λŠ” 것 처럼 보인닀.

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° 전에 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•œλ‹€.

λ˜ν•œ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° μ „ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μœ„ν•œκ³Όμ •μ—μ„œ λͺ¨λ“  μ„ μ–Έ(var, let, const, function, class)을 μŠ€μ½”ν”„μ— λ“±λ‘ν•œλ‹€.

이 λ•Œ μžλ°”μŠ€ν¬λ¦½νŠΈ Parserκ°€ ν•¨μˆ˜ μ‹€ν–‰ μ „ ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό ν•œ 번 μ κ²€ν•˜λ©΄μ„œ ν•„μš”ν•œ 값듀을 λŒμ–΄μ˜¬λ¦°λ‹€.

κ·Έλ ‡λ‹€λ©΄ λ³€μˆ˜ 선언을 ꡳ이 미리 μ•ˆν•΄λ„ λ˜λŠ” κ²ƒμΌκΉŒ?

κ·Έλ ‡μ§€λŠ” μ•Šλ‹€. let/const/class λ₯Ό μ΄μš©ν•œ μ„ μ–Έκ³Ό *ν•¨μˆ˜ ν‘œν˜„μ‹μ—μ„œλŠ” ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ”κ²ƒ 처럼 보인닀.

κ·ΈλŸ¬λ‚˜ λͺ¨λ“  선언에 ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜λŠ” 것은 λ§žλ‹€.

λ‹€λ§Œ let, const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” μŠ€μ½”ν”„μ˜ μ‹œμž‘μ—μ„œ λ³€μˆ˜μ˜ μ„ μ–ΈκΉŒμ§€ μΌμ‹œμ  μ‚¬κ°μ§€λŒ€(Temporal Dead Zone; TDZ)에 λΉ μ§€κΈ° λ•Œλ¬Έμ΄λ‹€.

μ—¬κΈ°μ„œ μ€‘μš”ν•œ 지점은 이 ν˜Έμ΄μŠ€νŒ…μ΄λΌλŠ” μš©μ–΄κ°€ β€˜μ„ μ–Έμ΄ λ¨Όμ € λ©”λͺ¨λ¦¬μ— μ €μž₯λ˜μ—ˆλ‹€.β€™λŠ” 것을 μ˜λ―Έν•˜κΈ° λ•Œλ¬Έμ—(선언이 λŒμ–΄μ˜¬λ €μ§„λ‹€β€™λŠ” 의미이기 λ•Œλ¬Έμ—)

λͺ¨λ“  선언은 ν˜Έμ΄μŠ€νŒ…μ΄ μΌμ–΄λ‚œλ‹€λŠ” 말은 μ°Έμ΄λœλ‹€.

즉 ν˜Έμ΄μŠ€νŒ…μ΄ 파일의 맨 μœ„λ‘œ λŒμ–΄μ˜¬λ €μ§€λŠ” ν˜„μƒμ„ μ˜λ―Έν•  λ•Œ μ„ μ–Έλ¬Έ 이전에 μ°Έμ‘°ν•΄μ„œ μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚¨λ‹€κ³  ν˜Έμ΄μŠ€νŒ…μ΄ μΌμ–΄λ‚˜μ§€ μ•Šμ€ 것은 μ•„λ‹ˆλΌλŠ” μ˜λ―Έμ΄λ‹€.

λ­”κ°€ μ΄λž¬λ‹€ μ €λž¬λ‹€ ν•˜λŠ” 것 κ°™μœΌλ‹ˆ 정리λ₯Ό ν•΄λ³΄μž.

λ‹€μŒμ˜ λͺ…μ œλ“€μ€ λͺ¨λ‘ 참이닀.

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“  μ„ μ–Έμ—λŠ” ν˜Έμ΄μŠ€νŒ…μ΄ μΌμ–΄λ‚œλ‹€.

letκ³Ό constλŠ” μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ€ μƒνƒœλ‘œ μ„ μ–Έλ§Œ λ©”λͺ¨λ¦¬μ— μ €μž₯λœλ‹€.

선언은 λŒμ–΄μ˜¬λ €μ§€κ³  (선언이 μ½”λ“œ μ‹€ν–‰ 전에 λ©”λͺ¨λ¦¬μ— μ €μž₯), 값이 μ΄ˆκΈ°ν™”κ°€ λ˜μ§€ μ•Šμ•„ μ°Έμ‘°ν•  수 μ—†μ–΄ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

ν˜Έμ΄μŠ€νŒ…μ΄ μΌμ–΄λ‚˜μ§€ μ•Šμ•„μ„œ μ—λŸ¬κ°€ λ°œμƒν•˜λŠ” 것이 μ•„λ‹ˆλΌ, ν˜Έμ΄μŠ€νŒ…μ΄ 일어났기 λ•Œλ¬Έμ— μ—λŸ¬κ°€ λ°œμƒν•˜λŠ” 것.

μœ„μ˜ μ½”λ“œλŠ” foo λ³€μˆ˜μ˜ 선언이 ν˜Έμ΄μŠ€νŒ… λ˜μ§€ μ•Šμ•˜λ‹€λ©΄, μ—λŸ¬ 없이 λ™μž‘ν•  것이닀.

μ™œ? μŠ€μ½”ν”„ μ²΄μΈμ—μ„œ ν˜„μž¬ μŠ€μ½”ν”„λΆ€ν„° μƒμœ„ μŠ€μ½”ν”„λ‘œ μ΄λ™ν•˜λ©΄μ„œ fooλ₯Ό 찾을 것이기 λ•Œλ¬Έμ΄λ‹€.

κ·ΈλŸ¬λ‚˜ ν˜„μž¬ μŠ€μ½”ν”„μ— foo 선언문이 μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ—, ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν–ˆμœΌλ‚˜ 값이 μ΄ˆκΈ°ν™” λ˜μ§€ μ•Šμ•„ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€!

μžλ°”μŠ€ν¬λ¦½νŠΈ Parser λ‚΄λΆ€μ˜ λ™μž‘ 방식을 μœ μΆ”ν•΄λ³΄μžλ©΄ λ‹€μŒκ³Ό 같을 것이닀.

ν•¨μˆ˜ μ„ μ–Έλ¬Έμ—μ„œμ˜ ν˜Έμ΄μŠ€νŒ…

ν•¨μˆ˜μ„ μ–Έλ¬Έμ€ μ½”λ“œλ₯Ό κ΅¬ν˜„ν•œ μœ„μΉ˜μ™€ 관계없이 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ νŠΉμ§•μΈ ν˜Έμ΄μŠ€νŒ…μ— 따라 λΈŒλΌμš°μ €κ°€ μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό 해석할 λ•Œ 맨 μœ„λ‘œ λŒμ–΄ μ˜¬λ €μ§„λ‹€.

ν•¨μˆ˜ ν‘œν˜„μ‹μ—μ„œμ˜ ν˜Έμ΄μŠ€νŒ…

ν•¨μˆ˜ν‘œν˜„μ‹μ€ ν•¨μˆ˜μ„ μ–Έλ¬Έκ³Ό 달리 μ„ μ–Έκ³Ό 호좜 μˆœμ„œμ— λ”°λΌμ„œ μ •μƒμ μœΌλ‘œ ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜μ§€ μ•Šμ„ 수 μžˆλ‹€.

ν•¨μˆ˜ν‘œν˜„μ‹μ—μ„œλŠ” μ„ μ–Έκ³Ό ν• λ‹Ήμ˜ 뢄리가 λ°œμƒν•œλ‹€.

  • ν•¨μˆ˜ ν‘œν˜„μ‹μ˜ 선언이 ν˜ΈμΆœλ³΄λ‹€ μœ„μ— μžˆλŠ” 경우

  • ν•¨μˆ˜ ν‘œν˜„μ‹μ˜ 선언이 ν˜ΈμΆœλ³΄λ‹€ μ•„λž˜μ— μžˆλŠ” 경우 (var λ³€μˆ˜ ν• λ‹Ή)

  • ν•¨μˆ˜ ν‘œν˜„μ‹μ˜ 선언이 ν˜ΈμΆœλ³΄λ‹€ μ•„λž˜μ— μžˆλŠ” 경우 (let/const λ³€μˆ˜ ν• λ‹Ή)

Last updated