🌸13μž₯. μŠ€μ½”ν”„

βœ…13.1 μŠ€μ½”ν”„λž€?

μŠ€μ½”ν”„(scope) == μ‹λ³„μžκ°€ μœ νš¨ν•œ λ²”μœ„ == μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ‹λ³„μžλ₯Ό 검색할 λ•Œ μ‚¬μš©ν•˜λŠ” κ·œμΉ™
  • λͺ¨λ“  μ‹λ³„μž(λ³€μˆ˜ 이름, ν•¨μˆ˜ 이름, 클래슀 이름 λ“±)λŠ” μžμ‹ μ΄ μ„ μ–Έλœ μœ„μΉ˜μ— μ˜ν•΄ λ‹€λ₯Έ μ½”λ“œκ°€ μ‹λ³„μž μžμ‹ μ„ μ°Έμ‘°ν•  수 μžˆλŠ” 유효 λ²”μœ„κ°€ κ²°μ •λœλ‹€.

μ‹λ³„μž κ²°μ •(identifier resolution)

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ–΄λ–€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•΄μ•Όν•  μ§€ κ²°μ •ν•˜λŠ” 것
var x = "global";

function foo() {
    var x = "local";
    console.log(x); // (1) local
}

foo();
console.log(x); // (2) global
  • μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ½”λ“œλ₯Ό μ‹€ν–‰ν•  λ•Œ μ½”λ“œμ˜ λ¬Έλ§₯(context)을 κ³ λ €ν•œλ‹€.

  • μ½”λ“œκ°€ μ–΄λ””μ—μ„œ μ‹€ν–‰λ˜κ³  주변에 μ–΄λ–€ μ½”λ“œκ°€ μžˆλŠ”μ§€(λ ‰μ‹œμ»¬ ν™˜κ²½)에 따라 λ™μΌν•œ μ½”λ“œ(1κ³Ό 2)도 λ‹€λ₯Έ κ²°κ³Όλ₯Ό λ§Œλ“ λ‹€.

μŠ€μ½”ν”„λŠ” λ„€μž„μŠ€νŽ˜μ΄μŠ€λ‹€.

μŠ€μ½”ν”„ λ‚΄μ—μ„œ μ‹λ³„μžλŠ” μœ μΌν•΄μ•Όν•˜μ§€λ§Œ, λ‹€λ₯Έ μŠ€μ½”ν”„μ—λŠ” 같은 μ΄λ¦„μ˜ μ‹λ³„μžλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.
  • μ‹λ³„μžλŠ” μ–΄λ–€ 값을 ꡬ별할 수 μžˆμ–΄μ•Όν•˜λ―€λ‘œ μœ μΌν•΄μ•Όν•œλ‹€. β†’ μ‹λ³„μžμΈ λ³€μˆ˜ 이름은 쀑볡될 수 μ—†λ‹€. β‡’ ν•˜λ‚˜μ˜ 값은 μœ μΌν•œ μ‹λ³„μžμ— μ—°κ²°(name binding)λ˜μ–΄μ•Ό ν•œλ‹€.

βœ…13.2 μŠ€μ½”ν”„μ˜ μ’…λ₯˜

λ³€μˆ˜λŠ” μžμ‹ μ΄ μ„ μ–Έλœ μœ„μΉ˜(μ „μ—­/μ§€μ—­)에 μ˜ν•΄ μžμ‹ μ΄ μœ νš¨ν•œ λ²”μœ„μΈ μŠ€μ½”ν”„κ°€ κ²°μ •λœλ‹€.
ꡬ뢄
μ„€λͺ…
μŠ€μ½”ν”„
λ³€μˆ˜

μ „μ—­

μ½”λ“œμ˜ κ°€μž₯ λ°”κΉ₯ μ˜μ—­

μ „μ—­ μŠ€μ½”ν”„

μ „μ—­ λ³€μˆ˜

μ§€μ—­

ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€

μ§€μ—­ μŠ€μ½”ν”„

μ§€μ—­ λ³€μˆ˜

  • μ „μ—­λ³€μˆ˜λŠ” μ–΄λ””μ„œλ“ μ§€ μ°Έμ‘°ν•  수 μžˆλ‹€.

  • μ§€μ—­λ³€μˆ˜λŠ” μžμ‹ μ˜ μ§€μ—­ μŠ€μ½”ν”„μ™€ ν•˜μœ„ μ§€μ—­ μŠ€μ½”ν”„μ—μ„œ μ°Έμ‘°ν•  수 μžˆλ‹€.

βœ…13.3 μŠ€μ½”ν”„ 체인

μŠ€μ½”ν”„ 체인 == μŠ€μ½”ν”„λŠ” ν•¨μˆ˜μ˜ 쀑첩에 μ˜ν•΄Β κ³„μΈ΅μ  ꡬ쑰λ₯Ό κ°–λŠ”λ‹€.
  • λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  λ•Œ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μŠ€μ½”ν”„ 체인을 톡해 λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λŠ” μ½”λ“œμ˜ μŠ€μ½”ν”„μ—μ„œ μ‹œμž‘ν•˜μ—¬ μƒμœ„ μŠ€μ½”ν”„ λ°©ν–₯으둜 μ΄λ™ν•˜λ©° μ„ μ–Έλœ λ³€μˆ˜λ₯Ό 검색(identifier resoluton)ν•œλ‹€.

image
  • μ§€μ—­ : outer ν•¨μˆ˜ & innter ν•¨μˆ˜

  • innerν•¨μˆ˜λŠ” outer ν•¨μˆ˜μ˜ μ€‘μ²©ν•¨μˆ˜

  • outer ν•¨μˆ˜κ°€ λ§Œλ“  μ§€μ—­ μŠ€μ½”ν”„λŠ” inner ν•¨μˆ˜κ°€ λ§Œλ“  μ§€μ—­ μŠ€μ½”ν”„μ˜ μƒμœ„μŠ€μ½”ν”„μ΄κ³ 

  • outer ν•¨μˆ˜μ˜ μ§€μ—­ μŠ€μ½”ν”„μ˜ μƒμœ„μŠ€μ½”ν”„λŠ” μ „μ—­ μŠ€μ½”ν”„λ‹€.

@μ™ΈλΆ€ ν•¨μˆ˜(outer function): 쀑첩 ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•˜λŠ” ν•¨μˆ˜

@쀑첩 ν•¨μˆ˜(nested function): ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€μ—μ„œ ν•¨μˆ˜κ°€ μ •μ˜λœ 것

μŠ€μ½”ν”„ 체인에 μ˜ν•œ λ³€μˆ˜ 검색

μƒμœ„ μŠ€μ½”ν”„μ—μ„œ μœ νš¨ν•œ λ³€μˆ˜λŠ” ν•˜μœ„ μŠ€μ½”ν”„μ—μ„œ 자유둭게 μ°Έμ‘°ν•  수 μžˆμ§€λ§Œ ν•˜μœ„ μŠ€μ½”ν”„μ—μ„œ μœ νš¨ν•œ λ³€μˆ˜λ₯Ό μƒμœ„ μŠ€μ½”ν”„μ—μ„œ μ°Έμ‘°ν•  수 μ—†λ‹€.
var x = "global x";
var y = "global y";

function outer() {
    var z = "outer's local z";

    function inner() {
        var x = "inner's local x";
        console.log(x); // (4) inner's local x
        console.log(y); // (5) global y
    }

    inner();
}

outer();

λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λŠ” μŠ€μ½”ν”„μ—μ„œ 검색 β†’ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ μƒμœ„μŠ€μ½”ν”„λ‘œ 이동 ν›„ 검색

(4) x λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λŠ” μŠ€μ½”ν”„μΈ inner ν•¨μˆ˜μ˜ μ§€μ—­ μŠ€μ½”ν”„μ—μ„œ x λ³€μˆ˜ 검색 β†’ 쑴재 O : κ²€μƒ‰λœ λ³€μˆ˜ μ°Έμ‘° ν›„ μ’…λ£Œ

(5) y λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λŠ” μŠ€μ½”ν”„μΈ inner ν•¨μˆ˜μ˜ μ§€μ—­ μŠ€μ½”ν”„μ—μ„œ y λ³€μˆ˜ 검색 β†’ 쑴재 X β†’ μƒμœ„ μŠ€μ½”ν”„μΈ outer ν•¨μˆ˜μ˜ μ§€μ—­ μŠ€μ½”ν”„λ‘œ 이동 β†’ outer에도 쑴재 X β†’ μƒμœ„ μŠ€μ½”ν”„μΈ μ „μ—­ μŠ€μ½”ν”„λ‘œ 이동 β†’ 쑴재 O : κ²€μƒ‰λœ λ³€μˆ˜ μ°Έμ‘° ν›„ μ’…λ£Œ

μŠ€μ½”ν”„ 체인에 μ˜ν•œ ν•¨μˆ˜ 검색

// μ „μ—­ ν•¨μˆ˜
function foo() {
    console.log("global function foo");
}

function bar() {
    // 쀑첩 ν•¨μˆ˜
    function foo() {
        console.log("local function foo");
    }

    foo(); // (1)
}

bar();

// 좜λ ₯된 κ°’ : local function foo

ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜λ©΄, λŸ°νƒ€μž„ 이전에 ν•¨μˆ˜ 객체가 λ¨Όμ € μƒμ„±λœλ‹€. 그리고 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 ν•¨μˆ˜ 이름과 λ™μΌν•œ μ΄λ¦„μ˜ μ‹λ³„μžλ₯Ό μ•”λ¬΅μ μœΌλ‘œ μ„ μ–Έν•˜κ³  μƒμ„±λœ ν•¨μˆ˜ 객체λ₯Ό ν• λ‹Ήν•œλ‹€. [12μž₯ ν•¨μˆ˜ μ°Έκ³ ]

λ”°λΌμ„œ, μœ„ μ½”λ“œμ—μ„œ (1)μ—μ„œ foo ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄

  • μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κΈ° μœ„ν•΄ ν•¨μˆ˜λ₯Ό κ°€λ¦¬ν‚€λŠ” μ‹λ³„μž fooλ₯Ό κ²€μƒ‰ν•œλ‹€.

βœ…13.4 ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„

  • 블둝 레벨 μŠ€μ½”ν”„(block level scope)

    • ν•¨μˆ˜ λͺΈμ²΄λ§Œμ΄ μ•„λ‹ˆλΌ λͺ¨λ“  μ½”λ“œ 블둝(if, for, while, try/catch λ“±)이 μ§€μ—­ μŠ€μ½”ν”„μ„ λ§Œλ“ λ‹€.

  • ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„(function level scope)

    • var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” μ˜€λ‘œμ§€ ν•¨μˆ˜μ˜ μ½”λ“œ 블둝(ν•¨μˆ˜ λͺΈμ²΄)λ§Œμ„ μ§€μ—­μŠ€μ½”ν”„λ‘œ μΈμ •ν•œλ‹€.

    • λ”°λΌμ„œ, ν•¨μˆ˜ λ°–μ—μ„œ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” μ½”λ“œ 블둝 λ‚΄μ—μ„œ μ„ μ–Έλ˜μ—ˆλ‹€ 할지라도 λͺ¨λ‘ μ „μ—­ λ³€μˆ˜λ‹€.

var x = 1; // μ „μ—­

if (true) {
    var x = 10; // 쀑볡 μ„ μ–Έ
}

console.log(x); // 10

βœ…13.5 λ ‰μ‹œμ»¬ μŠ€μ½”ν”„

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λ ‰μ‹œμ»¬ μŠ€μ½”ν”„λ₯Ό λ”°λ₯Έλ‹€.

ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•˜λŠ” 방식

  1. ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ ν˜ΈμΆœν–ˆλŠ” 지에 따라 κ²°μ • β†’ 동적 μŠ€μ½”ν”„(dynamic scope)

  2. ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ μ •μ˜ν–ˆλŠ” 지에 따라 κ²°μ •β†’ 정적 μŠ€μ½”ν”„(static scope) / λ ‰μ‹œμ»¬ μŠ€μ½”ν”„(lexical scope)

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λ ‰μ‹œμ»¬ μŠ€μ½”ν”„λ₯Ό λ”°λ₯Έλ‹€.

  • λ”°λΌμ„œ, ν•¨μˆ˜κ°€ 호좜된 μœ„μΉ˜λŠ” μƒμœ„ μŠ€μ½”ν”„ 결정에 μ–΄λ– ν•œ 영ν–₯도 μ£Όμ§€ μ•ŠλŠ”λ‹€.

  • ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„λŠ” μ–Έμ œλ‚˜ μžμ‹ μ˜ μ •μ˜λœ μŠ€μ½”ν”„λ‹€.

  • ν•¨μˆ˜μ˜ μƒμœ„μŠ€μ½”ν”„λŠ” ν•¨μˆ˜ μ •μ˜κ°€ 싀행될 λ•Œ μ •μ μœΌλ‘œ κ²°μ •λœλ‹€.

Last updated