Frontend/JavaScript

ν˜Έμ΄μŠ€νŒ…(hoisting)

wam 2024. 3. 5. 18:13
πŸ’‘ν˜Έμ΄μŠ€νŒ… - JavaScript 엔진이 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° 전에 λ³€μˆ˜ 및 ν•¨μˆ˜ 선언을 λ©”λͺ¨λ¦¬μ— λŒμ–΄μ˜¬λ¦¬λŠ” 것

 

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

λ³€μˆ˜μ™€ ν•¨μˆ˜ 선언이 μ΅œμƒλ‹¨μœΌλ‘œ μ˜¬λ €μ§€λŠ” ν˜„μƒ

console.log(a);

func();

function func() {
  console.log('ν•¨μˆ˜μ‹€ν–‰');
}

var a = 'λ³€μˆ˜';

μœ„ 경우, ν•¨μˆ˜μ‹€ν–‰μ€ μ œλŒ€λ‘œ μž‘λ™ν•˜κ³ , λ³€μˆ˜λŠ” μ΄ˆκΈ°ν™”κ°€ 아직 λ˜μ§€ μ•Šμ€ 값이라 undefinedκ°€ 좜λ ₯λœλ‹€.

 

 

λ‹€μ‹œ 말해, JavaScript 엔진이 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° 전에 λ³€μˆ˜ 및 ν•¨μˆ˜ 선언을 λ©”λͺ¨λ¦¬μ— λŒμ–΄μ˜¬λ¦¬λŠ” 것이닀. 즉, μ½”λ“œ μ‹€ν–‰ 이전에 μ„ μ–Έλœ λ³€μˆ˜μ™€ ν•¨μˆ˜κ°€ λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλ˜μ–΄ κ·Έλ“€μ˜ μŠ€μ½”ν”„ λ‚΄μ—μ„œ μ–΄λ””μ—μ„œλ“ μ§€ μ ‘κ·Όν•  수 μžˆλ‹€.

console.log(x); // undefined
var x = 5;
console.log(x); // 5

μœ„μ˜ μ½”λ“œμ—μ„œ var x = 5의 선언은 ν˜Έμ΄μŠ€νŒ… λ˜μ–΄ console.log(x); 이전에 μ ‘κ·Ό κ°€λŠ₯ν•˜μ§€λ§Œ, 값은 ν• λ‹Ήλ˜κΈ° μ „μ΄λ―€λ‘œ undefinedκ°€ 좜λ ₯λœλ‹€. μ΄λ ‡κ²Œ μ„ μ–ΈλΆ€κ°€ λ¨Όμ € ν˜Έμ΄μŠ€νŒ… 되고, 할당은 κ·Έ μžλ¦¬μ— 남아 있게 λœλ‹€.

 

 

ν•¨μˆ˜ ν‘œν˜„μ‹ (ν•¨μˆ˜λ₯Ό λ³€μˆ˜μ— λ‹΄μ•„μ„œ 그것을 μ‹€ν–‰ν•˜λŠ” 경우)으둜 μž‘μ„±ν•˜λ©΄, ν˜Έμ΄μŠ€νŒ…μœΌλ‘œ 인해 μ„ μ–Έλ§Œ λ¨Όμ € λ˜λ―€λ‘œ, μ—λŸ¬κ°€ λœ¬λ‹€.

func2();

// ν•¨μˆ˜ ν‘œν˜„μ‹
let func2 = function() {
    console.log('func2');
}

ν•¨μˆ˜ ν‘œν˜„μ‹μœΌλ‘œ μ„ μ–Έν–ˆμ„ λ•Œ μ—λŸ¬κ°€ λ‚˜λŠ” μ΄μœ λŠ” μ „μ—­ 객체에 func2 λ³€μˆ˜κ°€ μƒμ„±λμ§€λ§Œ, 할당될 ν•¨μˆ˜μ˜ μ΄ˆκΈ°ν™”κ°€ 아직 μ•ˆ 된 μƒνƒœμ—μ„œ ν˜ΈμΆœν–ˆκΈ° λ•Œλ¬Έμ΄λ‹€.

 

 

func1();

// ν•¨μˆ˜ μ„ μ–Έλ¬Έ
function func1() {
    console.log('func1');
}

λ°˜λ©΄μ— ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜ν•œ ν•¨μˆ˜λŠ” ν•¨μˆ˜ 객체가 이미 λ©”λͺ¨λ¦¬μ— μ˜¬λΌμ™€ μžˆλŠ” μƒνƒœμ—μ„œ ν˜ΈμΆœν–ˆκΈ° λ•Œλ¬Έμ— μ •μƒμ μœΌλ‘œ 호좜된 것이닀. 즉, ν•¨μˆ˜ 선언은 ν•¨μˆ˜κ°€ 호좜되기 전에 μ‚¬μš©ν•  수 μžˆλ‹€.

 

 

μœ„μ˜ μ˜ˆμ œμ—μ„œ func1()λ₯Ό ν˜ΈμΆœν•˜κΈ° 전에 ν•¨μˆ˜ func1의 선언이 ν˜Έμ΄μŠ€νŒ… λ˜μ–΄ μžˆμœΌλ―€λ‘œ 호좜이 κ°€λŠ₯ν•˜λ‹€.

 

 

μ°Έκ³  : const, let, const 차이 νŽ˜μ΄μ§€