ν‹°μŠ€ν† λ¦¬ λ·°

μŠ€μ½”ν”„(Scope)λž€?

μŠ€μ½”ν”„λŠ” μ§μ—­ν•˜μžλ©΄ "λ²”μœ„"λΌλŠ” 뜻이고, μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œμ˜ μŠ€μ½”ν”„λŠ” μ‹λ³„μžκ°€ μœ νš¨ν•œ λ²”μœ„λ₯Ό λœ»ν•©λ‹ˆλ‹€.

λ³€μˆ˜ 이름, ν•¨μˆ˜ 이름, 클래슀 이름 λ“± λͺ¨λ“  μ‹λ³„μžλŠ” μžμ‹ μ΄ μ„ μ–Έλœ μœ„μΉ˜μ— μ˜ν•΄ λ‹€λ₯Έ μ½”λ“œκ°€ μ‹λ²½μž μžμ‹ μ„ μ°Έμ‘°ν•  수 μžˆλŠ” 유효 λ²”μœ„κ°€ κ²°μ •λ˜λŠ”λ° 이 유효 λ²”μœ„κ°€ μŠ€μ½”ν”„μž…λ‹ˆλ‹€.

// μ „μ—­ λ³€μˆ˜
var x = 'global';

function foo() {
    // 지역 λ³€μˆ˜
    var x = 'local';
    console.log(x); // "local"
}

console.log(x); // "global"
  • μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 이름이 같은 두 개의 λ³€μˆ˜ μ€‘μ—μ„œ μ–΄λ–€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•΄μ•Ό ν•  것인지 μ‹λ³„μž 결정해야함
  • μŠ€μ½”ν”„λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ‹λ³„μžλ₯Ό 검색할 λ•Œ μ‚¬μš©ν•˜λŠ” κ·œμΉ™
  • μŠ€μ½”ν”„ λ‚΄μ—μ„œ μ‹λ³„μžλŠ” μœ μΌν•΄μ•Όν•¨ (λ‹€λ₯Έ μŠ€μ½”ν”„μ—λŠ” 같은 μ΄λ¦„μ˜ μ‹λ³„μž μ‚¬μš© κ°€λŠ₯, C++의 λ„€μž„μŠ€νŽ˜μ΄μŠ€μ™€ λΉ„μŠ·ν•¨)

 

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

λ³€μˆ˜μ™€ 같은 μ‹λ³„μžλŠ” μžμ‹ μ΄ μ„ μ–Έλœ μœ„μΉ˜μ— μ˜ν•΄ μžμ‹ μ΄ μœ νš¨ν•œ λ²”μœ„μΈ μŠ€μ½”ν”„κ°€ κ²°μ •λ©λ‹ˆλ‹€. μ΄λ•Œ μœ„μΉ˜λŠ” μ „μ—­κ³Ό μ§€μ—­μœΌλ‘œ ꡬ뢄할 수 μžˆμŠ΅λ‹ˆλ‹€.

ꡬ뢄 μ„€λͺ… μŠ€μ½”ν”„ λ³€μˆ˜
μ „μ—­ - μ½”λ“œμ˜ κ°€μž₯ λ°”κΉ₯ μ˜μ—­
- μ–΄λ””μ„œλ“ μ§€ μ°Έμ‘° κ°€λŠ₯
μ „μ—­ μŠ€μ½”ν”„ μ „μ—­ λ³€μˆ˜
지역 - ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€
- μžμ‹ μ˜ 지역 μŠ€μ½”ν”„μ™€ ν•˜μœ„ 지역 μŠ€μ½”ν”„μ—μ„œ 유효
지역 μŠ€μ½”ν”„ 지역 λ³€μˆ˜

 

μŠ€μ½”ν”„ 체인

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μŠ€μ½”ν”„ 체인을 톡해 μ°Έμ‘°ν•  λ³€μˆ˜λ₯Ό κ²€μƒ‰ν•©λ‹ˆλ‹€. μŠ€μ½”ν”„λŠ” ν•¨μˆ˜μ˜ 쀑첩에 μ˜ν•΄ 계측적 ꡬ쑰λ₯Ό κ°–λŠ”λ°, μ΄λ ‡κ²Œ κ³„μΈ΅μ μœΌλ‘œ μ—°κ²°λœ 것을 μŠ€μ½”ν”„ 체인이라 ν•©λ‹ˆλ‹€. λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  λ•Œ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μŠ€μ½”ν”„ 체인을 톡해 λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λŠ” μ½”λ“œμ˜ μŠ€μ½”ν”„μ—μ„œ μ‹œμž‘ν•˜μ—¬ μƒμœ„ μŠ€μ½”ν”„ λ°©ν–₯으둜 μ΄λ™ν•˜λ©° μ„ μ–Έλœ λ³€μˆ˜λ₯Ό κ²€μƒ‰ν•©λ‹ˆλ‹€.

 

// μ „μ—­ μŠ€μ½”ν”„
var x = "global x";
var y = "global y";

function outer() {
    // 지역 μŠ€μ½”ν”„
    var z = "outer's local z";
    
    console.log(x); // "global x"
    console.log(y); // "global y"
    console.log(z); // "outer's local z"
    
    function inner() {
        var x = "inner's local x";
        
        console.log(x); // "inner's local x"
        console.log(y); // "global y"
        console.log(z); // "outer's local z"
    }
    
    inner();
}

outer();

console.log(x); // "global x"
console.log(z); // ReferenceError

 

μœ„μ˜ μ½”λ“œμ˜ μŠ€μ½”ν”„ 체인을 그림으둜 ν‘œν˜„ν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • μœ„ κ·Έλ¦Όκ³Ό μœ μ‚¬ν•œ 자료ꡬ쑰인 *λ ‰μ‹œμ»¬ ν™˜κ²½μ„ μ‹€μ„Έλ‘œ 생성 (물리적으둜 μ‘΄μž¬ν•¨)
  • λ³€μˆ˜ 선언이 μ‹€ν–‰λ˜λ©΄ λ³€μˆ˜ μ‹λ³„μžκ°€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— ν‚€λ‘œ 등둝됨
  • λ³€μˆ˜ 할당이 μΌμ–΄λ‚˜λ©΄ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ λ³€μˆ˜ μ‹λ³„μžμ— ν•΄λ‹Ήν•˜λŠ” 값을 λ³€κ²½
  • λ³€μˆ˜μ˜ 검색도 λ ‰μ‹œμ»¬ ν™˜κ²½μ—μ„œ 이루어짐

*λ ‰μ‹œμ»¬ ν™˜κ²½ : μ½”λ“œκ°€ μ–΄λ””μ„œ μ‹€ν–‰λ˜λ©° 주변에 μ–΄λ–€ μ½”λ“œκ°€ μžˆλŠ”μ§€. μŠ€μ½”ν”„ 체인은 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ 단방ν–₯ μ—°κ²°ν•œ κ²ƒμž„.

 

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μŠ€μ½”ν”„ 체인을 따라 λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λŠ” μ½”λ“œμ˜ μŠ€μ½”ν”„μ—μ„œ μ‹œμž‘ν•΄μ„œ μƒμœ„ μŠ€μ½”ν”„ λ°©ν–₯으둜 μ΄λ™ν•˜λ©° μ„ μ–Έλœ λ³€μˆ˜λ₯Ό κ²€μƒ‰ν•©λ‹ˆλ‹€. μœ„μ˜ μ˜ˆμ‹œ μ½”λ“œμ™€ ν•¨κ»˜ μ‚΄νŽ΄λ³΄λ©΄ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

  • inner()ν•¨μˆ˜μ˜ console.log(y)문은 지역 μŠ€μ½”ν”„μ—μ„œ yλ³€μˆ˜κ°€ μ—†μœΌλ©΄, μƒμœ„ μŠ€μ½”ν”„ outer()λ₯Ό κ²€μƒ‰ν•˜μ—¬ ν•΄λ‹Ή ν•¨μˆ˜μ—λ„ μ—†κΈ° λ•Œλ¬Έμ— outer()의 μƒμœ„ μŠ€μ½”ν”„μΈ μ „μ—­ μŠ€μ½”ν”„λ‘œ μ΄λ™ν•˜μ—¬ "global y"λ₯Ό 좜λ ₯
  • 전역에 μžˆλŠ” console.log(z)문은 μžμ‹ μ˜ μŠ€μ½”ν”„μΈ 전역에 zλ³€μˆ˜κ°€ μ—†μœΌλ―€λ‘œ ReferenceErrorκ°€ λ°œμƒ
  • Java의 상속과 μœ μ‚¬ν•œ κ°œλ…

λ³€μˆ˜μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ ν•¨μˆ˜λ„ μ‹λ³„μžμ— ν•΄λ‹Ήλ˜κΈ° λ•Œλ¬Έμ— μŠ€μ½”ν”„λ₯Ό κ°€μ§€κ²Œ λ©λ‹ˆλ‹€. 결둠적으둜 μŠ€μ½”ν”„λŠ” μ‹λ³„μžλ₯Ό κ²€μƒ‰ν•˜λŠ” κ·œμΉ™μ΄λΌ μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„

지역 μŠ€μ½”ν”„κ°€ ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€λ₯Ό μŠ€μ½”ν”„λ‘œ κ°€μ§€λŠ” κ²ƒμ²˜λŸΌ, μ½”λ“œ 블둝이 μ•„λ‹Œ ν•¨μˆ˜μ— μ˜ν•΄μ„œλ§Œ 지역 μŠ€μ½”ν”„κ°€ μƒμ„±λ˜λŠ” 것을 ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„λΌν•©λ‹ˆλ‹€. λŒ€λΆ€λΆ„μ˜ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λŠ” 블둝 레벨 μŠ€μ½”ν”„μΈ 반면 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λ“€μ€ ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„ νŠΉμ„±μ„ κ°€μ§‘λ‹ˆλ‹€.

μ’…λ₯˜ μ„€λͺ… ν‚€μ›Œλ“œ
ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„ μ˜€λ‘œμ§€ ν•¨μˆ˜μ˜ μ½”λ“œ 블둝(ν•¨μˆ˜ λͺΈμ²΄)λ§Œμ„ 지역 μŠ€μ½”ν”„λ‘œ 인정 var
블둝 레벨 μŠ€μ½”ν”„ λͺ¨λ“  μ½”λ“œ 블둝이 지역 μŠ€μ½”ν”„λ₯Ό 생성 let, const
var x = 1;

if(true) {
    var x = 10;
}

console.log(x); // 10

 

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

 

ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•˜λŠ” λ°©λ²•μ—λŠ” λ™μ  μŠ€μ½”ν”„μ™€ λ ‰μ‹œμ»¬ μŠ€μ½”ν”„ 2가지가 μ‘΄μž¬ν•©λ‹ˆλ‹€.

  • 동적 μŠ€μ½”ν”„ : ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ ν˜ΈμΆœν–ˆλŠ”μ§€μ— 따라 ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •
  • λ ‰μ‹œμ»¬(정적) μŠ€μ½”ν”„ : ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ μ •μ˜ν–ˆλŠ”μ§€μ— 따라 ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •
var x = 1;

function foo() {
    var x = 10;
    bar();
}

function bar() {
    console.log(x);
}

foo(); // 1
bar(); // 1

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λ ‰μ‹œμ»¬ μŠ€μ½”ν”„λ₯Ό 따라 ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ μ •μ˜ν–ˆλŠ”μ§€μ— 따라 μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•˜κ²Œ λ©λ‹ˆλ‹€. 즉, ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„λŠ” μ–Έμ œλ‚˜ μžμ‹ μ΄ μ •μ˜λœ μŠ€μ½”ν”„μ΄κΈ° λ•Œλ¬Έμ— μœ„와 같은 μƒν™©μ—μ„œ bar()λŠ” μ–΄λ””μ„œ 호좜되던 bar()의 μƒμœ„ μŠ€μ½”ν”„μΈ μ „μ—­ λ³€μˆ˜x의 κ°’ 1을 좜λ ₯ν•˜κ²Œ λ©λ‹ˆλ‹€.

 

 

 

[좜처] λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive

https://wikibook.co.kr/mjs/

 

λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive: μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κΈ°λ³Έ κ°œλ…κ³Ό λ™μž‘ 원리

269개의 κ·Έλ¦Όκ³Ό 원리λ₯Ό νŒŒν—€μΉ˜λŠ” μ„€λͺ…μœΌλ‘œ ‘μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κΈ°λ³Έ κ°œλ…κ³Ό λ™μž‘ 원리’λ₯Ό μ΄ν•΄ν•˜μž! μ›ΉνŽ˜μ΄μ§€μ˜ λ‹¨μˆœν•œ 보쑰 κΈ°λŠ₯을 μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ μ œν•œμ μΈ μš©λ„λ‘œ νƒœμ–΄λ‚œ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 과도

wikibook.co.kr