<star />

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

JavaScript πŸ“

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

별깅 2022. 12. 9. 23:03
728x90

 

1. λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…

 

console.log(foo);	// ReferenceError : foo is not defined
let foo;

 

let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λ₯Ό λ³€μˆ˜ μ„ μ–Έλ¬Έ 이전에 μ°Έμ‘°ν•˜λ©΄ μ°Έμ‘° μ—λŸ¬ (ReferenceError) κ°€ λ°œμƒν•¨.

 

console.log(z);	// undefined
var z;

 

var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λŸ°νƒ€μž„ 이전에 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ μ•”λ¬΅μ μœΌλ‘œ "μ„ μ–Έ 단계" 와 "μ΄ˆκΈ°ν™” 단계" κ°€ ν•œλ²ˆμ— 진행됨.

μ„ μ–Έ λ‹¨κ³„μ—μ„œ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½, 즉 μŠ€μ½”ν”„μ— λ³€μˆ˜ μ‹λ³„μžλ₯Ό λ“±λ‘ν•˜μ—¬ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 λ³€μˆ˜μ˜ 쑴재λ₯Ό μ•Œλ¦Ό πŸ‘‰πŸ»

그리고 μ¦‰μ‹œ μ΄ˆκΈ°ν™” λ‹¨κ³„μ—μ„œ undefined 둜 λ³€μˆ˜λ₯Ό μ΄ˆκΈ°ν™”ν•¨. πŸ‘‰πŸ» λ³€μˆ˜ μ„ μ–Έλ¬Έ 이전에 λ³€μˆ˜μ— 접근해도 μŠ€μ½”ν”„μ— λ³€μˆ˜κ°€ μ‘΄μž¬ν•˜κΈ° λ•œμ— μ—λŸ¬κ°€ λ°œμƒ μ•ˆ 함. πŸ‘‰πŸ» λ‹€λ§Œ undefined λ₯Ό λ°˜ν™˜ν•¨! 이후, λ³€μˆ˜ 할당문에 λ„λ‹¬ν•˜λ©΄ λΉ„λ‘œμ†Œ 값이 할당될 것.

 

// var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λŸ°νƒ€μž„ 이전에 μ„ μ–Έ 단계와 μ΄ˆκΈ°ν™” 단계가 싀행됨
// λ”°λΌμ„œ λ³€μˆ˜ μ„ μ–Έλ¬Έ 이전에 λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€.

console.log(foo);	// undefined

var foo;
console.log(foo);	// undefined

foo = 1;	// ν• λ‹Ήλ¬Έμ—μ„œ ν• λ‹Ή 단계가 싀행됨
console.log(foo);	// 1

 

let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” "μ„ μ–Έ 단계" 와 "μ΄ˆκΈ°ν™” 단계" κ°€ λΆ„λ¦¬λ˜μ–΄ 진행됨.

즉, λŸ°νƒ€μž„ 이전에 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ μ•”λ¬΅μ μœΌλ‘œ μ„ μ–Έ 단계가 λ¨Όμ € μ‹€ν–‰λ˜μ§€λ§Œ μ΄ˆκΈ°ν™” λ‹¨κ³„λŠ” λ³€μˆ˜ 선언문에 λ„λ‹¬ν–ˆμ„ λ•Œ 싀행됨. let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μŠ€μ½”ν”„μ˜ μ‹œμž‘ 지점뢀터 μ΄ˆκΈ°ν™” 단계 μ‹œμž‘ 지점 (λ³€μˆ˜ μ„ μ–Έλ¬Έ)κΉŒμ§€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μ—†λ‹€.

 

μŠ€μ½”ν”„μ˜ μ‹œμž‘ 지점뢀터 μ΄ˆκΈ°ν™” μ‹œμž‘ μ§€μ κΉŒμ§€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μ—†λŠ” ꡬ간을 μΌμ‹œμ  μ‚¬κ°μ§€λŒ€ (Temporal Dead Zone: TDZ) 라고 뢀름.

 

😺 let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•Šλ‚˜μš”?

-> 놉. ν˜Έμ΄μŠ€νŒ… λ°œμƒν•©λ‹ˆλ‹€.

 

let foo = 1;	// μ „μ—­λ³€μˆ˜
{
    console.log(foo);	// ReferenceError: Cannot access 'foo' before initialization
    let foo = 2; 	// μ§€μ—­λ³€μˆ˜
}

 

μœ„ μ½”λ“œμ²˜λŸΌ let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λ„ μ—¬μ „νžˆ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜κΈ° λ•Œλ¬Έμ— μ°Έμ‘° μ—λŸ¬ (Reference Error) κ°€ λ°œμƒν•¨.

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ES6 μ—μ„œ λ„μž…λœ let, const λ₯Ό ν¬ν•¨ν•΄μ„œ λͺ¨λ“  μ„ μ–Έ (var, let, const, function, function*, class λ“±) 을 ν˜Έμ΄μŠ€νŒ… 함.

단, ES6 μ—μ„œ λ„μž…λœ let, const, class λ₯Ό μ‚¬μš©ν•œ 선언문은 ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ” κ²ƒμ²˜λŸΌ λ™μž‘ν•¨.

 

!...κ²°λ‘ ...!

 

λ³€μˆ˜ μ„ μ–Έ 3단계 : μ„ μ–Έ -> μ΄ˆκΈ°ν™” -> ν• λ‹Ή

 

ν˜Έμ΄μŠ€νŒ…μ€ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κ³  μ΄ˆκΈ°ν™” ν–ˆμ„ λ•Œ, μ„ μ–Έ 단계가 μ΅œμƒλ‹¨μœΌλ‘œ λŒμ–΄μ˜¬λ €μ§€λŠ” ν˜„μƒμ„ 말함.

var의 경우 λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κ³  μ΄ˆκΈ°ν™” ν•˜λŠ” 과정이 λ™μ‹œμ— μΌμ–΄λ‚˜μ„œ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•¨!

반면, let/const 의 경우 μ„ μ–Έκ³Ό μ΄ˆκΈ°ν™” 단계가 λ™μ‹œμ— μΌμ–΄λ‚˜μ§€ μ•ŠλŠ”λ‹€.

μ‹€ν–‰ μ‹œμ μ—μ„œ μ‹€μ œ μ„ μ–Έ 단계λ₯Ό λ§Œλ‚  λ•Œ μ΄ˆκΈ°ν™”κ°€ 이뀄짐.

κ·Έ μ‚¬μ΄μ˜ μ‹œκ°„μ„ μΌμ‹œμ  μ‚¬κ°μ§€λŒ€ (Temporal Dead Zone: TDZ) 이라고 ν•œλ‹€.

즉, μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— λ³€μˆ˜κ°€ 선언은 λ˜μ—ˆμœΌλ‚˜ λ©”λͺ¨λ¦¬κ°€ ν• λ‹Ήλ˜μ§€ μ•Šμ•„ μ°Έμ‘° μ—λŸ¬ (Reference Error) κ°€ λ°œμƒν•œλ‹€.

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

μ„ μ–Έλœ ν•¨μˆ˜λŠ” μƒλ‹¨μ—μ„œ μ°Έμ‘°, 호좜이 κ°€λŠ₯ν•˜λ‹€.

ν•¨μˆ˜ ν‘œν˜„μ‹μ€ κ²°κ΅­ λ³€μˆ˜μ— ν• λ‹Ήν•˜λŠ” λͺ¨μŠ΅μ΄λΌ λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ˜ μ‚¬λ‘€λ‘œ λ³Ό 수 μžˆλ‹€. 

728x90

'JavaScript πŸ“' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

null κ³Ό undefined 의 차이점  (0) 2022.12.21
이벀트 루프와 νƒœμŠ€ν¬ 큐  (0) 2022.12.18
동기/비동기  (0) 2022.12.10
ν΄λ‘œμ € (Closure)  (0) 2022.12.08
Truthy와 Falsy  (0) 2022.11.30
Comments