λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
javascript/πŸ“– study

[2μ£Όμ°¨ μŠ€ν„°λ””]13μž₯- μŠ€μ½”ν”„

by HomieKim 2022. 2. 6.

μŠ€μ½”ν”„

λͺ¨λ“  μ‹λ³„μžλŠ” μžμ‹ μ΄ μ„ μ–Έλœ μœ„μΉ˜μ— μ˜ν•΄ λ‹€λ₯Έ μ½”λ“œκ°€ μžμ‹ μ€ μ°Έμ‘°ν•  수 μžˆλŠ” 유효 λ²”μœ„κ°€ κ²°μ •λœλ‹€.
μŠ€μ½”ν”„(scope) : μ‹λ³„μžκ°€ μœ νš¨ν•œ λ²”μœ„

  • μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ½”λ“œλ₯Ό μ‹€ν–‰ν•  λ•Œ μ½”λ“œμ˜ λ¬Έλ§₯(context)λ₯Ό κ³ λ €ν•©λ‹ˆλ‹€.
  • 이름이 같은 두 λ³€μˆ˜μ€‘ μ–΄λ–€ 것을 참쑰할지 κ²°μ •ν•˜λŠ” 것을 μ‹λ³„μž 결정이라고 ν•©λ‹ˆλ‹€.
  • μŠ€μ½”ν”„(scopoe)λž€ μ‹λ³„μžλ₯Ό 검색할 λ•Œ μ‚¬μš©ν•˜λŠ” κ·œμΉ™μ΄λΌκ³  ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    μ½”λ“œκ°€ μ–΄λ””μ„œ μ‹€ν–‰λ˜λ©° 주변에 μ–΄λ–€μ½”λ“œκ°€ μžˆλŠ”μ§€λ₯Ό λ ‰μ‹œμ»¬ ν™˜κ²½(lexical enviroment)라고 ν•©λ‹ˆλ‹€. 즉, μ½”λ“œμ˜ contextλŠ” λ ‰μ‹œμ»¬ ν™˜κ²½μœΌλ‘œ κ΅¬μ„±λ˜κ³  이λ₯Ό κ΅¬ν˜„ν•œ 것이 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμž…λ‹ˆλ‹€.

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

  • μ½”λ“œλŠ” μ „μ—­(global)κ³Ό 지역(local)둜 ꡬ뢄할 수 μžˆμŠ΅λ‹ˆλ‹€.
ꡬ뢄 μ„€λͺ… μŠ€μ½”ν”„ λ³€μˆ˜
μ „μ—­ μ½”λ“œμ˜ κ°€μž₯ λ°”κΉ₯μ˜μ—­ μ „μ—­ μŠ€μ½”ν”„ μ „μ—­ λ³€μˆ˜
지역 ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€ 지역 μŠ€μ½”ν”„ 지역 λ³€μˆ˜

μ „μ—­κ³Ό μ „μ—­ μŠ€μ½”ν”„

  • μ „μ—­μ΄λž€ μ½”λ“œμ˜ κ°€μž₯ λ°”κΉ₯ μ˜μ—­μ„ λ§ν•œλ‹€.
  • 전역에 λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄ μ „μ—­λ³€μˆ˜, μ „μ—­ λ³€μˆ˜λŠ” μ–΄λ””μ„œλ“  μ°Έμ‘° κ°€λŠ₯

지역과 지역 μŠ€μ½”ν”„

  • μ§€μ—­μ΄λž€ ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€λ₯Ό λ§ν•œλ‹€.
  • 지역 λ³€μˆ˜λŠ” μžμ‹ μ΄ μ„ μ–Έλœ 지역과 ν•˜μœ„ 지역(μ€‘μ²©ν•¨μˆ˜)μ—μ„œλ§Œ μ°Έμ‘° κ°€λŠ₯

μŠ€μ½”ν”„ 체인

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

    즉, μƒμœ„ μŠ€μ½”ν”„μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜λ₯Ό ν•˜μœ„ μŠ€μ½”ν”„μ—μ„œ μ°Έμ‘°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° μ•žμ„œ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ μ‹€μ œλ‘œ μƒμ„±ν•©λ‹ˆλ‹€.

    λ ‰μ‹œμ»¬ ν™˜κ²½μ΄λž€ μŠ€μ½”ν”„ 체인을 κ΅¬ν˜„ν•œ μžλ£Œκ΅¬μ‘°μž…λ‹ˆλ‹€.
    λ³€μˆ˜ μ„ μ–Έ, ν• λ‹Ή, 검색도 이 자료ꡬ쑰 μƒμ—μ„œ 이루어 μ§‘λ‹ˆλ‹€.

λ³€μˆ˜ 검색

  • λ³€μˆ˜λŠ” μžμ‹ μ˜ μ§€μ—­μŠ€μ½”ν”„λ₯Ό λ¨Όμ € μ‘°μ‚¬ν•˜κ³  검색 λ˜μ§€ μ•ŠλŠ” 경우 μŠ€μ½”ν”„ 체인을 따라 μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²€μƒ‰ν•©λ‹ˆλ‹€.
  • 즉, ν•˜μœ„ μŠ€μ½”ν”„λ‘œ λ‚΄λ €κ°€λ©΄μ„œ μ‹λ³„μžλ₯Ό κ²€μƒ‰ν•˜λŠ” 일은 μ—†μŠ΅λ‹ˆλ‹€.
  • 정리 : ν•˜μœ„ μŠ€μ½”ν”„μ—μ„œ μƒμœ„ μŠ€μ½”ν”„μ˜ λ³€μˆ˜ μ°Έμ‘° κ°€λŠ₯, μƒμœ„ μŠ€μ½”ν”„μ—μ„œ ν•˜μœ„ μŠ€μ½”ν”„λ₯Ό μ°Έμ‘° λΆˆκ°€λŠ₯

ν•¨μˆ˜ 검색

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

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

  foo(); // κ²°κ³Ό : local function foo
}

bar();
  • λ³€μˆ˜ 검색과 λ§ˆμ°¬κ°€μ§€ λ°©μ‹μœΌλ‘œ λ™μž‘

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

  • ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„ : μ½”λ“œ 블둝이 μ•„λ‹Œ ν•¨μˆ˜μ— μ˜ν•΄μ„œλ§Œ 지역 μŠ€μ½”ν”„ 생성
  • 블둝 레벨 μŠ€μ½”ν”„ : λͺ¨λ“  μ½”λ“œλΈ”λ‘ (ν•¨μˆ˜ 포함 if, for, while λ“±λ“±)이 지역 μŠ€μ½”ν”„ 생성
  • varλŠ” ν•¨μˆ˜ μŠ€μ½”ν”„, let & constλŠ” 블둝 λ‹¨μœ„ μŠ€μ½”ν”„λ₯Ό κ°€μ§‘λ‹ˆλ‹€.
var x = 1;

if (true) {
  // var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” ν•¨μˆ˜μ˜ μ½”λ“œ 블둝(ν•¨μˆ˜ λͺΈμ²΄)λ§Œμ„ 지역 μŠ€μ½”ν”„λ‘œ μΈμ •ν•œλ‹€.
  // ν•¨μˆ˜ λ°–μ—μ„œ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” μ½”λ“œ 블둝 λ‚΄μ—μ„œ μ„ μ–Έλ˜μ—ˆλ‹€ 할지라도 λͺ¨λ‘ μ „μ—­ λ³€μˆ˜λ‹€.
  // λ”°λΌμ„œ xλŠ” μ „μ—­ λ³€μˆ˜λ‹€. 이미 μ„ μ–Έλœ μ „μ—­ λ³€μˆ˜ xκ°€ μžˆμœΌλ―€λ‘œ x λ³€μˆ˜λŠ” 쀑볡 μ„ μ–Έλœλ‹€.
  // μ΄λŠ” μ˜λ„μΉ˜ μ•Šκ²Œ λ³€μˆ˜ 값이 λ³€κ²½λ˜λŠ” λΆ€μž‘μš©μ„ λ°œμƒμ‹œν‚¨λ‹€.
  var x = 10;
}

console.log(x); // 10

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

동적 μŠ€μ½”ν”„(dynamic scope) : ν•¨μˆ˜κ°€ 호좜 λ˜λŠ” μ‹œμ μ— λ™μ μœΌλ‘œ μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •
λ ‰μ‹œμ»¬ μŠ€μ½”ν”„(lexical scope) λ˜λŠ” 정적 μŠ€μ½”ν”„(static scope) :ν•¨μˆ˜ μ •μ˜κ°€ ν‰κ°€λ˜λŠ” μ‹œμ μ— μƒμœ„ μŠ€μ½”ν”„κ°€ μ •μ μœΌλ‘œ κ²°μ •

  • μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λ ‰μ‹œμ»¬ μŠ€μ½”ν”„λ₯Ό 따름
  • 즉, ν•¨μˆ˜ 호좜 될 λ•Œκ°€ μ•„λ‹ˆλΌ ν•¨μˆ˜ μ •μ˜κ°€ μ‹€ν–‰ 될 λ•Œ μƒμœ„ μŠ€μ½”ν”„κ°€ κ²°μ • 됨
var x = 1;

function foo() {
  var x = 10;
  console.log(x); // 10
  bar();
}

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

foo(); // 1
bar(); // 1
console.log(x); // 1

λŒ“κΈ€