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

platforms

"Hoist"λΌλŠ” λ‹¨μ–΄λŠ” λ‹¨μˆœνžˆ λŒμ–΄μ˜¬λ¦¬λ‹€ λ˜λŠ” λ“€μ–΄μ˜¬λ¦¬λ‹€ λΌλŠ” 말을 λœ»ν•œλ‹€. 이 λ‹¨μ–΄μ˜ 뜻처럼 JavaScript의 ν˜Έμ΄μŠ€νŒ…μ€ ν•¨μˆ˜, λ³€μˆ˜ λ˜λŠ” 클래슀의 선언듀을 λͺ¨λ‘ λŒμ–΄μ˜¬λ €μ„œ 유효 λ²”μœ„μ˜ μ΅œμƒλ‹¨μ— μ„ μ–Έν•˜λŠ” JavaScript의 κ°œλ… λ˜λŠ” λ™μž‘μ΄λ‹€.

μ—¬κΈ°μ„œ Hoistingμ΄λž€ 직접 물리적으둜 λŒμ–΄μ˜¬λ¦¬λŠ”κ±Έ μ˜λ―Έν•˜λŠ”κ²Œ μ•„λ‹ˆλΌ, μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ‹€ν–‰ν•˜κΈ° 전에 전체 μ½”λ“œλ₯Ό ν•œ 번 μŠ€μΊ”ν•˜μ—¬ λ³€μˆ˜μ™€ ν•¨μˆ˜ 선언을 λ©”λͺ¨λ¦¬μ— μ €μž₯ν•˜λŠ”λ° 이둜 인해 μ½”λ“œ μƒμ—μ„œ μ„ μ–Έ 전에 λ³€μˆ˜λ‚˜ ν•¨μˆ˜λ₯Ό μ°Έμ‘°ν•  수 있게 λ˜λŠ”κ±Έ μ˜λ―Έν•œλ‹€.


ν•¨μˆ˜(Function) ν˜Έμ΄μŠ€νŒ…

printHello()
// hello

function printHello(){
    console.log('hello')
}

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

ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜λŠ” printHello()κ°€ ν•¨μˆ˜λ₯Ό ν• λ‹Ήν•˜λŠ” function printHello() {...} 보닀 μœ„μ— μž‘μ„±λ˜μ–΄ 있으면 ν˜Έμ΄μŠ€νŒ… κ°œλ… 없이 이둠적으둜 생각할 경우 printHello()λŠ” μ‹€ν–‰λ˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€.

ν•˜μ§€λ§Œ Hoisting κ°œλ…μ„ μ μš©ν•˜κ²Œ 되면 μ΅œμƒλ‹¨μ˜ printHello()도 μ •μƒμ μœΌλ‘œ μ‹€ν–‰λœλ‹€.


λ³€μˆ˜(Variable) ν˜Έμ΄μŠ€νŒ…

JavaScriptμ—μ„œλŠ” var, let 및 const λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ„ μ–Έν•  수 있으며 각자 λ‹€λ₯Έ ν˜Έμ΄μŠ€νŒ… κ°œλ…μ΄ μ μš©λœλ‹€.

var λ³€μˆ˜