JavaScript

μŠ€μ½”ν”„(Scope)

YunCow 2022. 8. 28. 04:51

μŠ€μ½”ν”„λž€ ? πŸ•Ά

  • μŠ€μ½”ν”„λž€, λͺ¨λ“  μ‹λ³„μž(λ³€μˆ˜,ν•¨μˆ˜,클래슀 λ“±)λŠ” μ„ μ–Έλœ μœ„μΉ˜μ— 따라 μ°Έμ‘°ν•  수 μžˆλŠ” μœ νš¨λ²”μœ„κ°€ κ²°μ •λ˜λŠ”λ° 이 말은 즉, μŠ€μ½”ν”„λŠ” μ‹λ³„μžκ°€ μœ νš¨ν•œ λ²”μœ„λΌ ν•  수 μžˆλ‹€.

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

  • μŠ€μ½”ν”„λŠ” μ „μ—­ μŠ€μ½”ν”„(global scope)와 μ§€μ—­ μŠ€μ½”ν”„(local scope)κ°€ μžˆλ‹€.
  • μŠ€μ½”ν”„λŠ” μ‹λ³„μžλ₯Ό μ„ μ–Έν•  λ•Œ μ •ν•΄μ§€λ©° 이런 κ°œλ…μ„ λ ‰μ‹œμ»¬ μŠ€μ½”ν”„λΌ ν•œλ‹€.
  • ν•¨μˆ˜λŠ” μ „μ—­ν•¨μˆ˜μ˜ 내뢀에도 μ •μ˜ν•  수 μžˆλ‹€. ν•¨μˆ˜μ˜ λ‚΄λΆ€μ—μ„œ μ •μ˜λœ ν•¨μˆ˜λ₯Ό 쀑첩 ν•¨μˆ˜λΌ ν•˜λ©° μ€‘μ²©ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•˜λŠ” ν•¨μˆ˜λ₯Ό μ™ΈλΆ€ ν•¨μˆ˜λΌκ³  ν•œλ‹€.
  • ν•¨μˆ˜κ°€ 쀑첩될 λ•Œ μ§€μ—­μŠ€μ½”ν”„λ„ 쀑첩될 수 μžˆλ‹€. 즉, μ™ΈλΆ€ ν•¨μˆ˜μ˜ μ§€μ—­ μŠ€μ½”ν”„μ™€ 쀑첩 ν•¨μˆ˜μ˜ λ‚΄λΆ€μ˜ μ§€μ—­ μŠ€μ½”ν”„λŠ” 계측적 ꡬ쑰λ₯Ό κ°€μ§€κ³  μ΄λ•Œ μ™ΈλΆ€ ν•¨μˆ˜μ˜ μ§€μ—­μŠ€μ½”ν”„λ₯Ό 쀑첩 ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„λΌ ν•œλ‹€.
var x = 'μ „μ—­ λ³€μˆ˜x'
var y = 'μ „μ—­ λ³€μˆ˜y'

const outer = () => {
    var z = 'outer μ§€μ—­ λ³€μˆ˜z';

    const inner = () => {
        var x = 'inner μ§€μ—­ λ³€μˆ˜x'
    }
}

console.log(x); // μ „μ—­ λ³€μˆ˜x
console.log(z); // z is not defined
  • μ „μ—­ λ³€μˆ˜ x와 yλŠ” μ „μ—­ μŠ€μ½”ν”„λ₯Ό κ°€μ§€λŠ” μ „μ—­λ³€μˆ˜κ°€ λœλ‹€.
  • μ§€μ—­ λ³€μˆ˜ zλŠ” μ„ μ–Έλœ μ§€μ—­(outerν•¨μˆ˜)의 μ§€μ—­ μŠ€μ½”ν”„λ₯Ό κ°€μ§€λ©° ν•˜μœ„ μ§€μ—­ μŠ€μ½”ν”„ κΉŒμ§€λ„ μœ νš¨ν•˜λ‹€.
  • inner ν•¨μˆ˜μ˜ μ§€μ—­ λ³€μˆ˜ xλŠ” innerν•¨μˆ˜ μ•ˆμ—μ„œλ§Œ μ°Έμ‘°ν•  수 μžˆλ‹€. innerν•¨μˆ˜ λ‚΄μ—μ„œ xλ₯Ό μ‚¬μš©ν•  경우 μ „μ—­ λ³€μˆ˜ xκ°€ μ•„λ‹Œ μ§€μ—­ λ³€μˆ˜ xκ°€ μ°Έμ‘°λœλ‹€. μ΄μœ λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μŠ€μ½”ν”„ 체인을 톡해 μ°Έμ‘°ν•  λ³€μˆ˜λ₯Ό κ²€μƒ‰ν–ˆκΈ° λ•Œλ¬Έ.

λ³€μˆ˜μ˜ μŠ€μ½”ν”„ (var, let, const)

var

var b = 5;

function varTest (){
    var a = 10;
    console.log(b); // 5 μ „μ—­λ³€μˆ˜
    
    for (i=0; i <= a; i++){
    	var c = 15;
    	console.log(a); // 10 ν•¨μˆ˜ λ‚΄ μœ νš¨λ²”μœ„
    }
    console.log(c); // 15 ν•¨μˆ˜ λ‚΄ μœ νš¨λ²”μœ„
}
varTest(); 
console.log(a); //a is not defined
console.log(b); // 5 μ „μ—­λ³€μˆ˜
  • var은 ν•¨μˆ˜λ ˆλ²¨μŠ€μ½”ν”„(Function Level Scope)⭐ λ‹€.
  • ν•¨μˆ˜λ ˆλ²¨μŠ€μ½”ν”„λŠ” ν•¨μˆ˜ λ‚΄μ—μ„œ μ„ μ–Έλœ λ³€μˆ˜μ˜ λ²”μœ„λŠ” ν•¨μˆ˜ 내뢀이며 ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œλŠ” μ°Έμ‘°ν•  수 μ—†λ‹€.
  • ν•¨μˆ˜λ‚΄λΆ€ μ„ μ–Έ -> μ§€μ—­λ³€μˆ˜
  • ν•¨μˆ˜μ™ΈλΆ€ μ„ μ–Έ -> μ „μ—­λ³€μˆ˜

 

let, const

let b = 5;

function letTest (){
    let a = 10;
    console.log(b); // bλŠ” μ „μ—­λ³€μˆ˜ μ‚¬μš©κ°€λŠ₯
    
    for (i=0; i <= a; i++){
    let c = 15;
    console.log(a); // ν•¨μˆ˜μ˜ μ½”λ“œλΈ”λ‘μ—μ„œ μ„ μ–Έ. μ§€μ—­λ³€μˆ˜λ‘œ μ‚¬μš©κ°€λŠ₯
    }
    console.log(c); // c is not defined 블둝 λ‚΄ μ„ μ–Έν•œ λ³€μˆ˜ μ—λŸ¬.
}
letTest(); 
console.log(a,c); //a,c is not defined
console.log(b); // 5 μ „μ—­λ³€μˆ˜
  • let, const λŠ” 블둝 레벨 μŠ€μ½”ν”„(Function Level Scope)⭐ λ‹€.
  • 블둝 레벨 μŠ€μ½”ν”„λŠ” μ½”λ“œ 블둝 {  } λ‚΄μ—μ„œ μ„ μ–Έλœ λ³€μˆ˜λŠ” μ½”λ“œ 블둝 λ‚΄μ—μ„œλ§Œ μœ νš¨ν•˜κ³  μ™ΈλΆ€μ—μ„œλŠ” μ°Έμ‘°ν•  수 μ—†λ‹€.
  • 블둝 λ‚΄λΆ€μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜ -> μ§€μ—­ λ³€μˆ˜
  • 블둝 μ™ΈλΆ€μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜ -> μ „μ—­ λ³€μˆ˜

β€» var, let은 μ„ μ–Έν• λ•Œ 값을 μ£Όμ§€ μ•Šμ•„λ„ λ˜μ§€λ§Œ constλŠ” μ΄ˆκΈ°κ°’ 할당이 ν•„μˆ˜β­

β€» var,let은 μž¬ν• λ‹Ή κ°€λŠ₯, const μž¬ν• λ‹Ή λΆˆκ°€λŠ₯⭐

 

λ ‰μ‹œμ»¬ μŠ€μ½”ν”„(Lexical Scope)

  • λ ‰μ‹œμ»¬ μŠ€μ½”ν”„λž€, ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ ν˜ΈμΆœν•˜λŠ”μ§€κ°€ μ•„λ‹Œ μ–΄λ””μ—μ„œ μ„ μ–Έν•˜μ˜€λŠ”μ§€μ— 따라 κ²°μ •λ˜λŠ” 것을 λ§ν•œλ‹€.
  • ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ μ„ μ–Έν•˜μ˜€λŠ”μ§€μ— 따라 μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•œλ‹€λŠ” 뜻이며 ν•¨μˆ˜μ˜ 선언에 따라 κ²°μ •λœλ‹€λŠ” 것이 μ€‘μš”ν•˜λ‹€.
  • μ •μ μŠ€μ½”ν”„(static scope) 라 λΆ€λ₯΄κΈ°λ„ ν•œλ‹€. ( λ°˜λŒ€λ‘œ ν˜ΈμΆœμ— μ˜ν•΄ μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•˜λ©΄ 동적 μŠ€μ½”ν”„(Dynamic Scope) 라 ν•œλ‹€, )
  • μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ •μ μŠ€μ½”ν”„λ₯Ό λ”°λ₯Έλ‹€. 
var x = 1; 

function test() {
  var x = 3;
  test2();
}

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

test(); // ?
test2(); // ?
  • ν•΄λ‹Ή μ½”λ“œμ—μ„œ 좜λ ₯값은 μ „μ—­ λ³€μˆ˜ x = 1 이 λ‘λ²ˆμΆœλ ₯λœλ‹€.
  • λ ‰μ‹œμ»¬ μŠ€μ½”ν”„λ‘œ 인해 test, test2 ν•¨μˆ˜κ°€ μ„ μ–Έλœ μœ„μΉ˜μ— 따라 μƒμœ„μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•˜λ―€λ‘œ testμ—μ„œ test2λ₯Ό ν˜ΈμΆœν•œλ“€ 이미 test2의 μŠ€μ½”ν”„λŠ” μ„ μ–Έλœ μœ„μΉ˜λ‘œ 인해 μƒμœ„ μŠ€μ½”ν”„κ°€ μ „μ—­ μŠ€μ½”ν”„κ°€ λ˜μ–΄μžˆκΈ°μ— 1이 λ‘λ²ˆ 좜λ ₯된 것 이닀.
  • μ „μ—­λ³€μˆ˜λ₯Ό μΈμ‹ν•˜λŠ” 방법을 μ•Œλ €λ©΄ μŠ€μ½”ν”„ 체인⭐을 μ•Œμ•„μ•Όν•œλ‹€.