Skip to content

Files

Latest commit

c148987 Β· Nov 29, 2021

History

History

10-Scope

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Nov 29, 2021

μŠ€μ½”ν”„(scope) = μ‹λ³„μž(identifier)κ°€ μœ μš”ν•œ λ²”μœ„ = μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ‹λ³„μžλ₯Ό 검색할 λ•Œ μ‚¬μš©ν•˜λŠ” κ·œμΉ™

  • λͺ¨λ“  μ‹λ³„μž(λ³€μˆ˜ 이름, ν•¨μˆ˜ 이름, 클래슀 이름 λ“±)λŠ” μžμ‹ μ΄ μ„ μ–Έλœ μœ„μΉ˜μ— μ˜ν•΄ λ‹€λ₯Έ μ½”λ“œκ°€ μ‹λ³„μž μžμ‹ μ„ μ°Έμ‘°ν•  수 μžˆλŠ” 유효 λ²”μœ„κ°€ κ²°μ •λœλ‹€.
var var1 = 1; // μ½”λ“œμ˜ κ°€μž₯ λ°”κΉ₯ μ˜μ—­μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜

if (true) {
  var var2 = 2; // μ½”λ“œ 블둝 λ‚΄μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜
  if (true) {
    var var3 = 3; // μ€‘μ²©λœ μ½”λ“œ 블둝 λ‚΄μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜
  }
}

function foo() {
  var var4 = 4; // ν•¨μˆ˜ λ‚΄μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜

  function bar() {
    var var5 = 5; // μ€‘μ²©λœ ν•¨μˆ˜ λ‚΄μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜
  }
}

console.log(var1); // 1
console.log(var2); // 2
console.log(var3); // 3
console.log(var4); // ReferenceError: var4 is not defined
console.log(var5); // ReferenceError: var4 is not defined

μ‹λ³„μž κ²°μ •

μ‹λ³„μž κ²°μ •(identifier resolution) = μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 이름이 같은 두 μ‹λ³„μž 쀑에 μ–΄λ–€ μ‹λ³„μžλ₯Ό μ°Έμ‘°ν•΄μ•Ό ν•  것인지λ₯Ό κ²°μ •ν•˜λŠ” 것

  • μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ½”λ“œλ₯Ό μ‹€ν–‰ν•  λ•Œ μ½”λ“œμ˜ λ¬Έλ§₯(context)을 κ³ λ €
  • μ½”λ“œκ°€ μ–΄λ””μ„œ μ‹€ν–‰λ˜λ©° 주변에 μ–΄λ–€ μ½”λ“œκ°€ μžˆλŠ”μ§€μ— 따라, λ™μΌν•œ μ½”λ“œλ„ λ‹€λ₯Έ κ²°κ³Όλ₯Ό λ§Œλ“ λ‹€.
var x = "global";

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

foo();
console.log(x); // global

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

  • μŠ€μ½”ν”„ λΌλŠ” κ°œλ…μ΄ μ—†λ‹€λ©΄, μœ„μ— μ½”λ“œ μƒν™©μ—μ„œλŠ” x λΌλŠ” λ³€μˆ˜κ°€ μ „μ—­ , foo ν•¨μˆ˜ λͺ¨λ‘ μ‘΄μž¬ν•΄μ„œ 좩돌 ν•  것이닀.
  • μ‹λ³„μžλŠ” μ–΄λ–€ 값을 ꡬ별할 수 μžˆμ–΄μ•Ό ν•˜λ―€λ‘œ 유일(unique)ν•΄μ•Ό ν•œλ‹€.
  • λ”°λΌμ„œ μ‹λ³„μžμΈ λ³€μˆ˜ 이름은 쀑볡될 수 μ—†λ‹€. β†’ ν•˜λ‚˜μ˜ 값은 μœ μΌν•œ μ‹λ³„μžμ— μ—°κ²°λ˜μ–΄μ•Ό ν•œλ‹€.
PCμ—μ„œ "λ™μΌν•œ 파일 이름" 이 μŠ€μ½”ν”„λ₯Ό ν†΅ν•œ μ‹λ³„μž κ²°μ • κ°€λŠ₯의 μ˜ˆμ‹œ 쀑 ν•˜λ‚˜μ΄λ‹€.
= "λ‹€λ₯Έ 폴더" 간에 "λ™μΌν•œ 파일 이름"은 λ‹€λ₯Έ 파일둜 μ‹λ³„ν•˜κ³  생성 κ°€λŠ₯


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

λ³€μˆ˜λŠ” μžμ‹ μ΄ μ„ μ–Έλœ μœ„μΉ˜μ— μ˜ν•΄ μžμ‹ μ΄ μœ μš”ν•œ λ²”μœ„μΈ μŠ€μ½”ν”„κ°€ κ²°μ •λœλ‹€.

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


μŠ€μ½”ν”„ 체인

[ πŸ’‘ 그전에 ]

+ "μ€‘μ²©ν•¨μˆ˜(nested function)" = ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€μ—μ„œ ν•¨μˆ˜κ°€ μ •μ˜λœ 것
+ "μ™ΈλΆ€ν•¨μˆ˜(outer function)" = 쀑첩 ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•˜λŠ” ν•¨μˆ˜

μŠ€μ½”ν”„μ²΄μΈ(scope chain) = μŠ€μ½”ν”„λŠ” ν•¨μˆ˜μ˜ 쀑첩에 μ˜ν•΄ 계측적 ꡬ쑰λ₯Ό κ°–λŠ”λ‹€.

Untitled

Untitled

  • λ³€μˆ˜ μ°Έμ‘° μ‹œ, μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μŠ€μ½”ν”„ 체인을 톡해 λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λŠ” μ½”λ“œμ˜ μŠ€μ½”ν”„μ—μ„œ μ‹œμž‘ν•˜μ—¬ μƒμœ„ μŠ€μ½”ν”„ λ°©ν–₯으둜 μ΄λ™ν•˜λ©° μ„ μ–Έλœ λ³€μˆ˜(= μ‹λ³„μž)λ₯Ό 검색(= κ²°μ •, identifier resolution)ν•œλ‹€.

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

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

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

  foo(); // local function foo
}

bar();
  • ν•¨μˆ˜ μ„ μ–Έλ¬Έ 으둜 ν•¨μˆ˜λ₯Ό μ •μ˜ β†’ λŸ°νƒ€μž„ 이전에 ν•¨μˆ˜ 객체가 λ¨Όμ € 생성

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 ν•¨μˆ˜ 이름과 λ™μΌν•œ μ΄λ¦„μ˜ μ‹λ³„μžλ₯Ό μ•”λ¬΅μ μœΌλ‘œ μ„ μ–Έν•˜κ³  μƒμ„±λœ ν•¨μˆ˜ 객체λ₯Ό ν• λ‹Ή ν•œλ‹€κ³  ν–ˆλ‹€.

  • ν•¨μˆ˜λ„ μ‹λ³„μžμ— ν• λ‹Ήλ˜κΈ° λ•Œλ¬Έμ— , μŠ€μ½”ν”„λ₯Ό κ°–λŠ”λ‹€.
  • λ”°λΌμ„œ μŠ€μ½”ν”„λ₯Ό "μ‹λ³„μžλ₯Ό κ²€μƒ‰ν•˜λŠ” κ·œμΉ™" 이라고 ν‘œν˜„ν•˜λŠ” 것이 μ ν•©ν•œ ν‘œν˜„μ΄λΌλŠ” 것이닀.


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

  • 블둝 레벨 μŠ€μ½”ν”„(block level scope)
    • ν•¨μˆ˜ λͺΈμ²΄λ§Œμ΄ μ•„λ‹ˆλΌ λͺ¨λ“  μ½”λ“œ 블둝( if, for, while, try - catch λ“± )이 지역 μŠ€μ½”ν”„λ₯Ό λ§Œλ“ λ‹€.
  • ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„(function level scope)
    • μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜ λŠ” μ˜€λ‘œμ§€ ν•¨μˆ˜μ˜ μ½”λ“œλΈ”λ‘(ν•¨μˆ˜ λͺΈμ²΄)λ§Œμ„ 지역 μŠ€μ½”ν”„λ‘œ μΈμ •ν•œλ‹€.
var x = 1;

if (true) {
  // ifλ¬Έ 블둝 λ‚΄λΆ€μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜ xλŠ” 지역 μŠ€μ½”ν”„κ°€ μ μš©λ˜μ§€ μ•ŠλŠ”λ‹€.
  // 그둜 인해, λ³€μˆ˜ xλŠ” 전역에 μžˆλŠ” 것과 ifλ¬Έ 내뢀에 μžˆλŠ” 것은 ν˜„μž¬ 쀑볡 μ„ μ–Έ 된 것이라 λ³Ό 수 μžˆλ‹€.
  var x = 10;
}

console.log(x); // 10


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

  • μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•˜λŠ” 방식
    • 동적 μŠ€μ½”ν”„(dynamic scope)
      • ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜λŠ” μ‹œμ μ— λ™μ μœΌλ‘œ μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •
    • 정적 μŠ€μ½”ν”„(static scope) λ˜λŠ” λ ‰μ‹œμ»¬ μŠ€μ½”ν”„(lexical scope)
      • ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ μ •μ˜ν–ˆλŠ”μ§€μ— 따라 μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •
      • Javascirpt λ₯Ό λΉ„λ‘―ν•œ λŒ€λΆ€λΆ„μ˜ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄κ°€ λ ‰μ‹œμ»¬ μŠ€μ½”ν”„λ₯Ό λ”°λ₯Έλ‹€.