Skip to content

Latest commit

Β 

History

History
87 lines (68 loc) Β· 2.91 KB

File metadata and controls

87 lines (68 loc) Β· 2.91 KB

Hoisting

hoist: λŒμ–΄μ˜¬λ¦¬λ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λŒμ–΄μ˜¬λ €μ§€λŠ” 것은 λ³€μˆ˜μ΄λ‹€. var keyword 둜 μ„ μ–Έλœ λͺ¨λ“  λ³€μˆ˜ 선언은 호이슀트 λœλ‹€.

λ³€μˆ˜κ°€ ν•¨μˆ˜ λ‚΄μ—μ„œ μ •μ˜λ˜μ—ˆμ„ 경우, 선언이 ν•¨μˆ˜μ˜ μ΅œμƒμœ„λ‘œ, ν•¨μˆ˜ λ°”κΉ₯μ—μ„œ μ •μ˜λ˜μ—ˆμ„ 경우, μ „μ—­ μ»¨ν…μŠ€νŠΈμ˜ μ΅œμƒμœ„λ‘œ 변경이 λœλ‹€.

var x;
console.log(x)
x = 100
console.log(x)

λ‹€λ₯Έ μ–Έμ–΄μ˜ 경우 λ³€μˆ˜ xλ₯Ό μ„ μ–Έν•˜μ§€ μ•Šκ³  좜λ ₯ν•˜λ € ν•œλ‹€λ©΄ μ—λŸ¬λ₯Ό λ°œμƒν•  것 이닀. ν•˜μ§€λ§Œ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 경우 undefined라고 ν•˜κ³  λ„˜μ–΄κ°„λ‹€. var x = 100 κ΅¬λ¬Έμ—μ„œ var xλ₯Ό 호이슀트 ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

선언문은 ν•­μ‹œ μžλ°”μŠ€ν¬λ¦½νŠΈ μ—”μ§„ κ΅¬λ™μ‹œ κ°€μž₯ μ΅œμš°μ„ μœΌλ‘œ ν•΄μ„ν•˜λ―€λ‘œ ν˜Έμ΄μŠ€νŒ… 되고, ν• λ‹Ή ꡬ문은 λŸ°νƒ€μž„ κ³Όμ •μ—μ„œ 이루어지기 λ•Œλ¬Έμ— ν˜Έμ΄μŠ€νŒ… λ˜μ§€ μ•ŠλŠ”λ‹€.

ν•¨μˆ˜ μ„ μ–Έλ¬Έκ³Ό ν•¨μˆ˜ ν‘œν˜„μ‹

  • ν•¨μˆ˜ μ„ μ–Έλ¬Έ: function μ •μ˜λΆ€λ§Œ μ‘΄μž¬ν•˜κ³  λ³„λ„μ˜ ν• λ‹Ή λͺ…령이 μ—†λŠ” 것을 μ˜λ―Έν•œλ‹€. ν•¨μˆ˜λͺ…이 μ •μ˜λ˜μ–΄μ•Ό ν•œλ‹€.
  • ν•¨μˆ˜ ν‘œν˜„μ‹: μ •μ˜ν•œ function을 λ³„λ„μ˜ λ³€μˆ˜μ— ν• λ‹Ήν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€. ν•¨μˆ˜λͺ…이 없어도 λœλ‹€.
function a() { } //ν•¨μˆ˜ μ„œμ–Έλ¬Έ ν•¨μˆ˜λͺ… aκ°€ κ³§ λ³€μˆ˜λͺ…
a()

var b = function() { }//읡λͺ… 함ㅅ ν‘œν˜„μ‹ λ³€μˆ˜λͺ… bκ°€ κ³§ ν•¨μˆ˜λͺ…
b()

var b = function d() { } //κΈ°λͺ… ν•¨μˆ˜ ν‘œν˜„μ‹ λ³€μˆ˜λͺ…은 c ν•¨μˆ˜λͺ…은 d
c()//μ‹€ν–‰ ok
d() // μ—λŸ¬!

ν•¨μˆ˜ 선언문은 전체λ₯Ό ν˜Έμ΄μŠ€νŒ…ν•œ 반면 ν•¨μˆ˜ ν‘œν˜„μ‹μ€ λ³€μˆ˜ μ„ μ–ΈλΆ€λ§Œ ν˜Έμ΄μŠ€νŒ…ν•œλ‹€.

foo( );
function foo( ){
  console.log(β€˜hello’);
};
// console> hello

foo ν•¨μˆ˜μ— λŒ€ν•œ 선언을 ν˜Έμ΄μŠ€νŒ…ν•˜μ—¬ global 객체에 λ“±λ‘μ‹œν‚€κΈ° λ•Œλ¬Έμ— helloκ°€ μ œλŒ€λ‘œ 좜λ ₯λœλ‹€.

foo( );
var foo = function( ) {
  console.log(β€˜hello’);
};
// console> Uncaught TypeError: foo is not a function

이 λ‘λ²ˆμ§Έ 예제의 ν•¨μˆ˜ ν‘œν˜„μ€ ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ„ ν• λ‹Ήν•˜λŠ” ꡬ쑰이기 λ•Œλ¬Έμ— ν˜Έμ΄μŠ€νŒ… λ˜μ§€ μ•ŠμœΌλ©° κ·Έλ ‡κΈ° λ•Œλ¬Έμ— λŸ°νƒ€μž„ ν™˜κ²½μ—μ„œ Type Errorλ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

ν˜Έμ΄μŠ€νŒ… μ˜ˆμ‹œ

function a() {
    console.log(b) // (1)
    var b = 'bbb' // μˆ˜μ§‘ λŒ€μƒ 1(λ³€μˆ˜ μ„ μ–Έ)
    console.log(b) // (2)
    function b() {} // μˆ˜μ§‘ λŒ€μƒ 2(ν•¨μˆ˜ μ„ μ–Έ)
    console.log(b)
}

ν˜Έμ΄μŠ€νŒ… 된 결과둜 보면

function a() {
    var b
    function b() {} //ν•¨μˆ˜ 선언은 전체λ₯Ό λŒμ–΄μ˜¬λ¦°λ‹€

    console.log(b) //(1) bν•¨μˆ˜
    b = 'bbb'
    console.log(b) //(2) 'bbb'
    console.log(b) //(3) 'bbb'
}

a()

λ©΄μ ‘ 질문

  1. ν˜Έμ΄μŠ€νŒ…(Hoisting)"에 λŒ€ν•΄μ„œ μ„€λͺ…ν•˜μ„Έμš”.

ν˜Έμ΄μŠ€νŒ…μ€ 인터프리터가 μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό 해석함에 μžˆμ–΄μ„œ, Global μ˜μ—­ λ˜λŠ” ν•¨μˆ˜ μ˜μ—­ μ•ˆμ— λŒ€ν•΄μ„œ μ£Όμ–΄μ§„ 선언듀을 λͺ¨λ‘ λŒμ–΄μ˜¬λ €μ„œ ν•΄λ‹Ή 유효 λ²”μœ„ μ΅œμƒλ‹¨μ— μ„ μ–Έν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€.