TIL/For Interview

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

"μœ λ‹ˆ" 2023. 8. 21. 16:17

 

 

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

ν˜Έμ΄μŠ€νŒ…μ΄λž€ μŠ€μ½”ν”„ μ•ˆμ— μ‘΄μž¬ν•˜λŠ” λͺ¨λ“  선언듀을 ν•΄λ‹Ή μŠ€μ½”ν”„μ˜ μ΅œμƒλ‹¨μœΌλ‘œ λŒμ–΄ μ˜¬λ¦¬λŠ” 것을 λ§ν•©λ‹ˆλ‹€. 

'Hoisting' 단어λ₯Ό 검색해 보면 κ·Έ λœ»λ„ 'λŒμ–΄ 올리기, λ“€μ–΄ 올렀 λ‚˜λ₯΄κΈ°'둜 λ‚˜μ˜€λ“― ν˜Έμ΄μŠ€νŒ…μ€ 무언가λ₯Ό λŒμ–΄ μ˜¬λ¦¬λŠ” ν–‰μœ„μž…λ‹ˆλ‹€. 

 

μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜λŠ” μ‹€ν–‰λ˜κΈ° 전에 ν•¨μˆ˜ μ•ˆμ— ν•„μš”ν•œ λ³€μˆ˜ 값듀을 λͺ¨λ‘ λͺ¨μ•„μ„œ 유효 λ²”μœ„μ˜ μ΅œμƒλ‹¨μ— μ„ μ–Έν•©λ‹ˆλ‹€. 즉, ν•¨μˆ˜ λ‚΄μ—μ„œ μ•„λž˜ μͺ½μ— μ‘΄μž¬ν•˜λŠ” λ‚΄μš© 쀑 ν•„μš”ν•œ 겂듀을 λŒμ–΄ μ˜¬λ¦¬λŠ” κ²ƒμž…λ‹ˆλ‹€. 

 

λͺ¨λ“  선언은 (fuction, var, let, const, class) ν˜Έμ΄μŠ€νŒ… λ©λ‹ˆλ‹€. varλŠ” μ„ μ–Έκ³Ό λ™μ‹œμ— μ΄ˆκΈ°ν™”κ°€ μ΄λ£¨μ–΄μ Έμ„œ undefined둜 ν• λ‹Ή λ˜μ§€λ§Œ, let 및 const 선언은 μ„ μ–Έλ§Œ 될 뿐, λ©”λͺ¨λ¦¬ 할당이 아직 λ˜μ§€ μ•Šμ€ TDZ에 λ“€μ–΄κ°€κ²Œ λ©λ‹ˆλ‹€.

 

❓TDZλž€? 
Temporal Dead Zone의 μ•½μžλ‘œ ν•œκΈ€λ‘œ μ§μ—­ν•˜λ©΄ μΌμ‹œμ  μ‚¬κ°μ§€λŒ€λΌλŠ” 뜻인데, μŠ€μ½”ν”„μ˜ μ‹œμž‘ 지점뢀터 μ΄ˆκΈ°ν™” μ‹œμž‘ 지점 κΉŒμ§€μ˜ ꡬ간을 TDZ라고 λΆ€λ¦…λ‹ˆλ‹€. 즉 λ³€μˆ˜κ°€ μ„ μ–Έλ˜κ³  λ³€μˆ˜μ˜ μ΄ˆκΈ°ν™”κ°€ 이루어지기 μ „κΉŒμ§€μ˜ ꡬ간이라고 말할 수 μžˆμŠ΅λ‹ˆλ‹€. 

 

ν˜Έμ΄μŠ€νŒ…μ€ ν•¨μˆ˜λ₯Ό 어디에 μ„ μ–Έ ν•˜μ˜€λ“ , 신경쓰지 μ•Šκ³  ν•„μš”ν•œ κ³³μ—μ„œ 자유둭게 μ‚¬μš©ν•˜κΈ° μœ„ν•΄ λ§Œλ“€μ–΄μ§„ κΈ°λŠ₯μž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ•Œλ‘œλŠ” μ˜λ„μΉ˜ μ•Šμ€ 버그λ₯Ό 생성할 여지가 있기 λ•Œλ¬Έμ—, 이λ₯Ό μ˜λ„μ μœΌλ‘œ μ‚¬μš©ν•˜λŠ” κ²½μš°κ°€ μ•„λ‹ˆλΌλ©΄ ν˜Έμ΄μŠ€νŒ…μ΄ λ˜μ§€ μ•Šκ±°λ‚˜, TDZ둜 μ΄ˆκΈ°ν™” λ˜λŠ” let, const, ν•¨μˆ˜ ν‘œν˜„μ‹μ„ μ‚¬μš©ν•˜λŠ” 것을 ꢌμž₯ν•©λ‹ˆλ‹€.

 

 

 

 

πŸ’Ÿ 꼬리 질문

πŸ™‹πŸ»‍♀️ μ™œ letκ³Ό const만 TDZκ°€ μ μš©λ˜λ‚˜μš”?

πŸ“ μ΄λŠ” Javascript λ³€μˆ˜ μ„ μ–Έμ˜ νŠΉμ„± λ•Œλ¬ΈμΈλ°, var와 let, const λ³€μˆ˜ 선언은 λ³€μˆ˜κ°€ μƒμ„±λ˜λŠ” μ‹œκΈ°μ™€ μ΄ˆκΈ°ν™”λ˜λŠ” μ‹œκΈ°μ— 차이가 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€. varλŠ” λ³€μˆ˜κ°€ μ„ μ–Έλ˜λŠ” μ‹œμ μ—μ„œ μ΄ˆκΈ°ν™”κ°€ ν•¨κ»˜ μ§„ν–‰λ˜λ©°, ν•΄λ‹Ή λ³€μˆ˜κ°€ μ„ μ–Έλ˜κΈ° 전에도 μ‚¬μš©ν•  수 있기 λ•Œλ¬Έμ— var λ³€μˆ˜λŠ” μ„ μ–Έλ˜κΈ° 전에 μ‚¬μš©ν•˜λ”λΌλ„ 'undefined'둜 μ΄ˆκΈ°ν™” λ©λ‹ˆλ‹€. 

κ·ΈλŸ¬λ‚˜ 'let'κ³Ό 'const'λŠ” λ³€μˆ˜κ°€ μ„ μ–Έλ˜λŠ” μ‹œμ μ—μ„œ μ΄ˆκΈ°ν™” λ˜μ§€ μ•Šκ³ , λ³€μˆ˜μ˜ μŠ€μ½”ν”„ λ‚΄μ—μ„œ μ‹€μ œ 할당문이 싀행될 λ•Œ μ΄ˆκΈ°ν™” λ©λ‹ˆλ‹€. μ΄λ‘œμΈν•΄ λ³€μˆ˜ μ„ μ–Έκ³Ό μ΄ˆκΈ°ν™” μ‚¬μ΄μ—μ„œ μΌμ‹œμ  μ‚¬κ°μ§€λŒ€(TDZ)κ°€ ν˜•μ„±λ©λ‹ˆλ‹€. 


πŸ™‹πŸ»‍♀️ ν˜Έμ΄μŠ€νŒ…μ€ μžλ°”μŠ€ν¬λ¦½νŠΈλ§Œμ˜ νŠΉμ§•μΈκ°€μš”?

πŸ“ λ„€, λ§žμŠ΅λ‹ˆλ‹€. ν˜Έμ΄μŠ€νŒ…μ€ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ…νŠΉν•œ νŠΉμ§•μ΄λ©°, μ‹€μ œ μ½”λ“œκ°€ λŒμ–΄ μ˜¬λ €μ§€λŠ” 것은 μ•„λ‹ˆκ³ , μžλ°”μŠ€ν¬λ¦½νŠΈ parserκ°€ λ‚΄λΆ€μ μœΌλ‘œ λŒμ–΄μ˜¬λ €μ„œ μ²˜λ¦¬ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 


πŸ™‹πŸ»‍♀️ λŒμ–΄ μ˜¬λ €μ§€λŠ” κ²ƒμ²˜λŸΌ λ™μž‘ν•œλ‹€κ³  말씀해 μ£Όμ…¨λŠ”λ°, 컴파일 λ‹¨κ³„μ—μ„œ μ‹€μ œλ‘œ μ½”λ“œκ°€ λŒμ–΄μ˜¬λ €μ§€μ§€λŠ” μ•Šλ‚˜μš”?

πŸ“ ν˜Έμ΄μŠ€νŒ…μ€ κ°œλ…μ μΈ μ„€λͺ…을 μœ„ν•΄ μ‚¬μš©λ˜λŠ” μš©μ–΄λΌμ„œ, μ½”λ“œκ°€ μ‹€μ œλ‘œ 물리적으둜 λŒμ–΄μ˜¬λ €μ§€μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€. κ·Έμ € μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ½”λ“œλ₯Ό ν•΄μ„ν•˜κ³ , μ‹€ν–‰ν•˜κΈ° 전에 λ‚΄λΆ€μ μœΌλ‘œ μ²˜λ¦¬ν•˜λŠ” 단계λ₯Ό λ‚˜νƒ€λ‚΄λŠ” κ°œλ…μž…λ‹ˆλ‹€.