η„‘μ œ

Variable Scope (λ³€μˆ˜ μŠ€μ½”ν”„)와 Hoisting (ν˜Έμ΄μŠ€νŒ…) λ³Έλ¬Έ

<script>

Variable Scope (λ³€μˆ˜ μŠ€μ½”ν”„)와 Hoisting (ν˜Έμ΄μŠ€νŒ…)

yo-u-loo 2026. 6. 2. 11:34

 

🟨 Variable Scope

λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆλŠ” λ²”μœ„λ₯Ό μ˜λ―Έν•œλ‹€. λ³€μˆ˜λŠ” μ„ μ–Έλœ μœ„μΉ˜μ— 따라 μ‚¬μš©ν•  수 μžˆλŠ” λ²”μœ„κ°€ κ²°μ •λœλ‹€.

 

β—Ό Global Scope (μ „μ—­ μŠ€μ½”ν”„)

ν•¨μˆ˜λ‚˜ 블둝({}) λ°–μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜. ν”„λ‘œκ·Έλž¨ μ–΄λ””μ—μ„œλ‚˜ μ ‘κ·Όν•  수 있으며, λͺ¨λ“  ν•¨μˆ˜μ™€ 블둝 λ‚΄λΆ€μ—μ„œλ„ μ ‘κ·Όν•  수 μžˆλ‹€.

let globalVar = "μ „μ—­ λ³€μˆ˜";

function test() { console.log(globalVar); // μ ‘κ·Ό κ°€λŠ₯
}

test(); console.log(globalVar); // μ ‘κ·Ό κ°€λŠ₯

 


 

❗ 단, 같은 μ΄λ¦„μ˜ μ§€μ—­ λ³€μˆ˜κ°€ 있으면 μ§€μ—­ λ³€μˆ˜κ°€ μš°μ„ ν•œλ‹€. ❗

let name = "μ „μ—­";

function test() {
    let name = "μ§€μ—­";
    console.log(name); // μ§€μ—­
}

 

β—Ό Local Scope (μ§€μ—­ μŠ€μ½”ν”„)

νŠΉμ • λ²”μœ„ μ•ˆμ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆλŠ” λ³€μˆ˜.

1️⃣ Function Scope (ν•¨μˆ˜ μŠ€μ½”ν”„)

function test() {
    let functionVar = "ν•¨μˆ˜ λ³€μˆ˜";
    console.log(functionVar); // μ ‘κ·Ό κ°€λŠ₯
}

test();

// console.log(functionVar); // μ—λŸ¬
  • ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” ν•΄λ‹Ή ν•¨μˆ˜ μ•ˆμ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆλ‹€.

 

2️⃣ Block Scope (블둝 μŠ€μ½”ν”„)

if (true) {
    let blockVar = "블둝 λ³€μˆ˜";
    console.log(blockVar); // μ ‘κ·Ό κ°€λŠ₯
}

// console.log(blockVar); // μ—λŸ¬
  • if, for, while λ“±μ˜ {} 블둝 μ•ˆμ—μ„œ let λ˜λŠ” const둜 μ„ μ–Έν•œ λ³€μˆ˜λŠ” ν•΄λ‹Ή 블둝 μ•ˆμ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆλ‹€.

 

β—Ό μŠ€μ½”ν”„μ˜ μ ‘κ·Ό λ²”μœ„

1️⃣ μ „μ—­ λ³€μˆ˜λŠ” μ–΄λ””μ„œλ“  μ ‘κ·Όν•  수 μžˆλ‹€.

2️⃣ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλŠ” μ „μ—­ λ³€μˆ˜μ™€ μžμ‹ μ˜ μ§€μ—­ λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆλ‹€.

3️⃣ 블둝 λ‚΄λΆ€μ—μ„œλŠ” μ „μ—­ λ³€μˆ˜, ν•¨μˆ˜ λ³€μˆ˜, 그리고 ν•΄λ‹Ή λΈ”λ‘μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆλ‹€.

4️⃣ 블둝 λ°–μ—μ„œλŠ” 블둝 λ³€μˆ˜μ— μ ‘κ·Όν•  수 μ—†λ‹€.

 

 


 

βš™οΈ μ‹€μ „ 예제 μ½”λ“œβš™οΈ

let globalVar = "μ „μ—­ λ³€μˆ˜";

function scopeTest() {
    let functionVar = "ν•¨μˆ˜ λ³€μˆ˜";
    
    if (true) {
        let blockVar = "블둝 λ³€μˆ˜";
        console.log(globalVar);   // μ ‘κ·Ό κ°€λŠ₯
        console.log(functionVar); // μ ‘κ·Ό κ°€λŠ₯
        console.log(blockVar);    // μ ‘κ·Ό κ°€λŠ₯
    }
    
    // console.log(blockVar); // μ—λŸ¬! 블둝 λ°–μ—μ„œλŠ” μ ‘κ·Ό λΆˆκ°€
}

scopeTest();

 


 

🟨 Hoisting

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° 전에 λ³€μˆ˜μ™€ ν•¨μˆ˜ 선언을 λ¨Όμ € μ²˜λ¦¬ν•˜λŠ” λ™μž‘μ„ μ˜λ―Έν•œλ‹€.

μ‹€μ œλ‘œ μ½”λ“œκ°€ μ΄λ™ν•˜λŠ” 것은 μ•„λ‹ˆλ©°, 선언이 μ½”λ“œμ˜ μ΅œμƒλ‹¨μœΌλ‘œ λŒμ–΄μ˜¬λ €μ§„ κ²ƒμ²˜λŸΌ λ™μž‘ν•œλ‹€.

 

β—Ό var λ³€μˆ˜μ˜ ν˜Έμ΄μŠ€νŒ…

console.log(name); // undefined

var name = "철수";
  • var둜 μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ„ μ–Έ 전에 μ°Έμ‘°ν•  수 μžˆμ§€λ§Œ, 값은 아직 ν• λ‹Ήλ˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— undefinedκ°€ 좜λ ₯λœλ‹€.

 

β—Ό let, const λ³€μˆ˜μ˜ ν˜Έμ΄μŠ€νŒ…

// console.log(age); // ReferenceError

let age = 25;
  • letκ³Ό const도 μ„ μ–Έ μžμ²΄λŠ” ν˜Έμ΄μŠ€νŒ…λ˜μ§€λ§Œ, μ΄ˆκΈ°ν™”λ˜κΈ° μ „κΉŒμ§€λŠ” TDZ(Temporal Dead Zone, μΌμ‹œμ  μ‚¬κ°μ§€λŒ€)​에 μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— μ ‘κ·Ό μ‹œ ReferenceErrorκ°€ λ°œμƒν•œλ‹€.

 

 

πŸ“ POINT πŸ“

βœ”οΈ μ§€μ—­ λ³€μˆ˜λŠ” μžμ‹ μ΄ μ„ μ–Έλœ μŠ€μ½”ν”„ μ•ˆμ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆλ‹€. βœ”οΈ

βœ”οΈ λ³€μˆ˜λŠ” μ‚¬μš©ν•˜κΈ° 전에 μ„ μ–Έν•˜λŠ” μŠ΅κ΄€μ„ λ“€μ΄λŠ” 것이 μ’‹λ‹€. βœ”️

βœ”οΈ ν˜„λŒ€ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” λ³΄μ•ˆκ³Ό μœ μ§€λ³΄μˆ˜λ₯Ό μœ„ν•΄ var λŒ€μ‹  letκ³Ό constλ₯Ό μ‚¬μš©ν•œλ‹€. βœ”οΈ

 

 

πŸ“‹ λ³€μˆ˜ μ„ μ–Έ 방식 비ꡐ πŸ“‹

ꡬ뢄 var let const
μŠ€μ½”ν”„ ν•¨μˆ˜ μŠ€μ½”ν”„ 블둝 μŠ€μ½”ν”„ 블둝 μŠ€μ½”ν”„
μž¬μ„ μ–Έ κ°€λŠ₯ λΆˆκ°€λŠ₯ λΆˆκ°€λŠ₯
μž¬ν• λ‹Ή κ°€λŠ₯ κ°€λŠ₯ λΆˆκ°€λŠ₯ (μƒμˆ˜)
ν˜Έμ΄μŠ€νŒ… O (undefined) O  (TDZ) O  (TDZ)
블둝 μŠ€μ½”ν”„ X O O

 


 

βš™οΈ μ‹€μ „ 예제 μ½”λ“œβš™οΈ

// 1. var의 경우
console.log(name); // κ²°κ³Ό: undefined (μ—λŸ¬λŠ” μ•ˆ λ‚˜μ§€λ§Œ 값이 μ—†μŒ)
var name = "철수";

// 2. let의 경우
// console.log(age); // κ²°κ³Ό: ReferenceError (TDZ λ•Œλ¬Έμ— μ—λŸ¬ λ°œμƒ)
let age = 25;

// 3. ν•¨μˆ˜μ˜ 경우
sayHi(); // κ²°κ³Ό: "μ•ˆλ…•!" (ν•¨μˆ˜ 선언문은 전체가 ν˜Έμ΄μŠ€νŒ…λ¨)

function sayHi() {
    console.log("μ•ˆλ…•!");
}

 

'<script>' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

Parameter (νŒŒλΌλ―Έν„°)와 Argument (μ•„κ·œλ¨ΌνŠΈ)  (0) 2026.06.02
var, let, const λ³€μˆ˜ μ„ μ–Έ 방식  (0) 2026.06.02
Function (ν•¨μˆ˜)  (0) 2026.06.02
Undefinedκ³Ό null  (0) 2026.05.28
break와 continue  (0) 2026.05.28