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

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ(execution context)λž€?

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ†ŒμŠ€μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 데 ν•„μš”ν•œ ν™˜κ²½μ„ μ œκ³΅ν•˜κ³  μ½”λ“œμ˜ μ‹€ν–‰ κ²°κ³Όλ₯Ό μ‹€μ œλ‘œ κ΄€λ¦¬ν•˜λŠ” μ˜μ—­μœΌλ‘œ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ™μž‘ 원리λ₯Ό λ‹΄κ³  μžˆλŠ” 핡심 κ°œλ…μž…λ‹ˆλ‹€.

 

μ†ŒμŠ€μ½”λ“œμ˜ νƒ€μž…

ECMAScript 사양은 μ†ŒμŠ€μ½”λ“œλ₯Ό 4가지 νƒ€μž…μœΌλ‘œ κ΅¬λΆ„ν•˜λŠ”λ° νƒ€μž…μ— 따라 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•˜λŠ” κ³Όμ •κ³Ό 관리 λ‚΄μš©μ΄ λ‹€λ¦…λ‹ˆλ‹€.

 

μ†ŒμŠ€μ½”λ“œ νƒ€μž… μ„€λͺ…
μ „μ—­ μ½”λ“œ - 전역에 μ‘΄μž¬ν•˜λŠ” μ†ŒμŠ€μ½”λ“œ
- μ΅œμƒμœ„ μŠ€μ½”ν”„μΈ μ „μ—­ μŠ€μ½”ν”„ 생성
- μ „μ—­ μ½”λ“œκ°€ ν‰κ°€λ˜λ©΄ μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ 생성
ν•¨μˆ˜ μ½”λ“œ - ν•¨μˆ˜ 내뢀에 μ‘΄μž¬ν•˜λŠ” μ†ŒμŠ€μ½”λ“œ
- 지역 μŠ€μ½”ν”„λ₯Ό 생성
- ν•¨μˆ˜ μ½”λ“œκ°€ ν‰κ°€λ˜λ©΄ ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ 생성
eval μ½”λ“œ - 빌트인 μ „μ—­ ν•¨μˆ˜μΈ eval ν•¨μˆ˜μ— 인자둜 μ „λ‹¬λ˜μ–΄ μ‹€ν–‰λ˜λŠ” μ†ŒμŠ€μ½”λ“œ
- strict modeμ—μ„œ μžμ‹ λ§Œμ˜ λ…μžμ μΈ μŠ€μ½”ν”„λ₯Ό 생성
- eval μ½”λ“œκ°€ ν‰κ°€λ˜λ©΄ eval μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ 생성
λͺ¨λ“ˆ μ½”λ“œ - λͺ¨λ“ˆ 내뢀에 μ‘΄μž¬ν•˜λŠ” μ†ŒμŠ€μ½”λ“œ
- λͺ¨λ“ˆλ³„λ‘œ 독립적인 λͺ¨λ“ˆ μŠ€μ½”ν”„λ₯Ό 생성
- μ½”λ“ˆ μ½”λ“œκ°€ ν‰κ°€λ˜λ©΄ λͺ¨λ“ˆ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ 생성

μ†ŒμŠ€μ½”λ“œμ˜ 평가와 μ‹€ν–‰

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ†ŒμŠ€μ½”λ“œλ₯Ό 2개의 κ³Όμ •, 즉 "μ†ŒμŠ€μ½”λ“œμ˜ 평가"와 "μ†ŒμŠ€μ½”λ“œμ˜ μ‹€ν–‰" κ³Όμ •μœΌλ‘œ λ‚˜λˆ„μ–΄ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

 

μ†ŒμŠ€μ½”λ“œ 평가 κ³Όμ •

  • μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•˜κ³  λ³€μˆ˜, ν•¨μˆ˜ λ“±μ˜ μ„ μ–Έλ¬Έλ§Œ λ¨Όμ € μ‹€ν–‰
  • μƒμ„±λœ λ³€μˆ˜λ‚˜ ν•¨μˆ˜ μ‹λ³„μžλ₯Ό ν‚€λ‘œ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ κ΄€λ¦¬ν•˜λŠ” μŠ€μ½”ν”„(λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ ν™˜κ²½ λ ˆμ½”λ“œ)에 등둝

μ†ŒμŠ€μ½”λ“œ μ‹€ν–‰ κ³Όμ •

  • 선언문을 μ œμ™Έν•œ μ†ŒμŠ€μ½”λ“œκ°€ 순차적으둜 μ‹€ν–‰λ˜κΈ° μ‹œμž‘ (λŸ°νƒ€μž„μ΄ μ‹œμž‘)
  • μ†ŒμŠ€μ½”λ“œ 싀행에 ν•„μš”ν•œ 정보, 즉 λ³€μˆ˜λ‚˜ ν•¨μˆ˜μ˜ μ°Έμ‘°λ₯Ό μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ κ΄€λ¦¬ν•˜λŠ” μŠ€μ½”ν”„μ—μ„œ κ²€μƒ‰ν•΄μ„œ 취득
  • λ³€μˆ˜ κ°’μ˜ λ³€κ²½ λ“± μ†ŒμŠ€μ½”λ“œμ˜ μ‹€ν–‰ κ²°κ³ΌλŠ” λ‹€μ‹œ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ κ΄€λ¦¬ν•˜λŠ” μŠ€μ½”ν”„μ— 등둝

 

μ•„λž˜ 예제 μ†ŒμŠ€μ½”λ“œκ°€ μ‹€ν–‰λœλ‹€λ©΄ μ†ŒμŠ€μ½”λ“œμ˜ 과정은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

var x;
x = 1;
  • μ†ŒμŠ€μ½”λ“œ 평가 κ³Όμ •μ—μ„œ λ³€μˆ˜ μ„ μ–Έλ¬Έ var x;λ₯Ό λ¨Όμ € μ‹€ν–‰
  • μ΄λ•Œ μƒμ„±λœ λ³€μˆ˜ μ‹λ³„μž xλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ κ΄€λ¦¬ν•˜λŠ” μŠ€μ½”ν”„μ— λ“±λ‘λ˜κ³  undefined둜 μ΄ˆκΈ°ν™”
  • λ³€μˆ˜ μ„ μ–Έλ¬Έ var x;λŠ” 평가 κ³Όμ •μ—μ„œ 이미 μ‹€ν–‰ μ™„λ£Œν–ˆμœΌλ―€λ‘œ μ†ŒμŠ€μ½”λ“œ μ‹€ν–‰ κ³Όμ •μ—μ„œλŠ” λ³€μˆ˜ ν• λ‹Ήλ¬Έ x = 1;만 μ‹€ν–‰
  • μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ κ΄€λ¦¬ν•˜λŠ” μŠ€μ½”ν”„μ— x λ³€μˆ˜κ°€ λ“±λ‘λ˜μ–΄ μžˆλŠ”μ§€ (μ„ μ–Έλœ λ³€μˆ˜μΈμ§€) 확인
  • x λ³€μˆ˜κ°€ μ„ μ–Έλœ λ³€μˆ˜λΌλ©΄ 값을 ν• λ‹Ήν•˜κ³  ν• λ‹Ή κ²°κ³Όλ₯Ό μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— λ“±λ‘ν•˜μ—¬ 관리

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ μ—­ν• 

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ‹λ³„μž(λ³€μˆ˜, ν•¨μˆ˜, 클래슀 λ“±μ˜ 이름)λ₯Ό λ“±λ‘ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” μŠ€μ½”ν”„μ™€ μ½”λ“œ μ‹€ν–‰ μˆœμ„œ 관리λ₯Ό κ΅¬ν˜„ν•œ λ‚΄λΆ€ λ©”μ»€λ‹ˆμ¦˜μœΌλ‘œ, λͺ¨λ“  μ½”λ“œλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό 톡해 μ‹€ν–‰λ˜κ³  κ΄€λ¦¬λ©λ‹ˆλ‹€.

 

μ•„λž˜ 예제λ₯Ό μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 ν‰κ°€ν•˜κ³  μ‹€ν–‰ν•˜λŠ” 과정은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

// μ „μ—­ λ³€μˆ˜ μ„ μ–Έ
const x = 1;
const y = 2;

// ν•¨μˆ˜ μ •μ˜
function foo(a) {
    // 지역 λ³€μˆ˜ μ„ μ–Έ
    const x = 10;
    const y = 20;
    
    // λ©”μ„œλ“œ 호좜
    console.log(a + x + y); // 130
}

// ν•¨μˆ˜ 호좜
foo(100);

// λ©”μ„œλ“œ 호좜
console.log(x + y); // 3

 

  • μ „μ—­ μ½”λ“œ 평가
    • μ„ μ–Έλ¬Έλ§Œ λ¨Όμ € μ‹€ν–‰λ˜κ³  μƒμ„±λœ μ „μ—­ λ³€μˆ˜μ™€ μ „μ—­ ν•¨μˆ˜κ°€ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ κ΄€λ¦¬ν•˜λŠ” μ „μ—­ μŠ€μ½”ν”„μ— 등둝
    • μ΄λ•Œ, var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ μ „μ—­ λ³€μˆ˜μ™€ ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜λœ μ „μ—­ ν•¨μˆ˜λŠ” μ „μ—­ 객체 ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œκ°€ 됨
  • μ „μ—­ μ½”λ“œ μ‹€ν–‰
    • λŸ°νƒ€μž„μ΄ μ‹œμž‘λ˜μ–΄ μ „μ—­ μ½”λ“œκ°€ 순차적으둜 μ‹€ν–‰. μ „μ—­ λ³€μˆ˜μ— 값이 ν• λ‹Ήλ˜κ³  ν•¨μˆ˜κ°€ 호좜됨
    • ν•¨μˆ˜κ°€ 호좜되면 순차적으둜 μ‹€ν–‰λ˜λ˜ μ „μ—­ μ½”λ“œμ˜ 싀행을 μΌμ‹œ μ€‘λ‹¨ν•˜κ³  μ½”λ“œ μ‹€ν–‰ μˆœμ„œλ₯Ό λ³€κ²½ν•˜μ—¬ ν•¨μˆ˜ λ‚΄λΆ€λ‘œ μ§„μž…ν•¨
  • ν•¨μˆ˜ μ½”λ“œ 평가
    • ν˜ΈμΆœμ„ 톡해 ν•¨μˆ˜ λ‚΄λΆ€λ‘œ μ§„μž…λ˜λ©΄ ν•¨μˆ˜ λ‚΄λΆ€μ˜ λ¬Έλ“€μ˜ μ½”λ“œ 평가 κ³Όμ •μ—μ„œ μƒμ„±λœ λ§€κ°œλ³€μˆ˜μ™€ 지역 λ³€μˆ˜κ°€ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ κ΄€λ¦¬ν•˜λŠ” 지역 μŠ€μ½”ν”„μ— 등둝
    • arguments 객체가 μƒμ„±λ˜μ–΄ 지역 μŠ€μ½”ν”„μ— 등둝
    • this 바인딩 κ²°μ •
  • ν•¨μˆ˜ μ½”λ“œ μ‹€ν–‰
    • ν•¨μˆ˜ μ½”λ“œ 평가 과정이 λλ‚˜λ©΄ λŸ°νƒ€μž„μ΄ μ‹œμž‘λ˜μ–΄ ν•¨μˆ˜ μ½”λ“œκ°€ 순차적으둜 μ‹€ν–‰
    • μ΄λ•Œ λ§€κ°œλ³€μˆ˜μ™€ 지역 λ³€μˆ˜μ— 값이 ν• λ‹Ήλ˜κ³  console.log λ©”μ„œλ“œκ°€ 호좜됨
    • μ‹λ³„μžμΈ console을 μŠ€μ½”ν”„ 체인을 톡해 κ²€μƒ‰ν•˜κ³  log ν”„λ‘œνΌν‹°λ₯Ό console 객체의 ν”„λ‘œν† νƒ€μž… 체인을 톡해 검색
    • console.log λ©”μ„œλ“œμ— 인수둜 μ „λ‹¬λœ ν‘œν˜„μ‹ a + x + yκ°€ ν‰κ°€λ˜κ³  a, x, y 각 μ‹λ³„μžλŠ” μŠ€μ½”ν”„ 체인을 톡해 검색됨
    • console.log λ©”μ„œλ“œ 싀행이 μ’…λ£Œλ˜λ©΄ ν•¨μˆ˜ 호좜 μ΄μ „μœΌλ‘œ λ˜λŒμ•„κ°€ μ „μ—­ μ½”λ“œ 싀행을 계속함

 

이처럼 μ½”λ“œκ°€ μ‹€ν–‰λ˜λ €λ©΄ λ‹€μŒκ³Ό 같은 μŠ€μ½”ν”„, μ‹λ³„μž, μ½”λ“œ μ‹€ν–‰ μˆœμ„œ λ“±μ˜ 관리가 ν•„μš”ν•©λ‹ˆλ‹€.

  1. 선언에 μ˜ν•΄ μƒμ„±λœ λͺ¨λ“  μ‹λ³„μžλ₯Ό μŠ€μ½”ν”„λ₯Ό κ΅¬λΆ„ν•˜μ—¬ λ“±λ‘ν•˜κ³  μƒνƒœλ³€ν™”λ₯Ό μ§€μ†μ μœΌλ‘œ 관리할 수 μžˆμ–΄μ•Ό 함
  2. μŠ€μ½”ν”„λŠ” 쀑첩 관계에 μ˜ν•΄ μŠ€μ½”ν”„ 체인을 ν˜•μ„±ν•΄μ•Όν•¨ (μŠ€μ½”ν”„ 체인을 톡해 μƒμœ„ μŠ€μ½”ν”„λ‘œ μ΄λ™ν•˜λ©° μ‹λ³„μžλ₯Ό 검색)
  3. ν˜„μž¬ 싀행쀑인 μ½”λ“œμ˜ μ‹€ν–‰ μˆœμ„œλ₯Ό λ³€κ²½ν•  수 μžˆμ–΄μ•Ό ν•˜λ©° λ‹€μ‹œ λ˜λŒμ•„κ°ˆ μˆ˜λ„ μžˆμ–΄μ•Ό 함

μ‹λ³„μžμ™€ μŠ€μ½”ν”„λŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μœΌλ‘œ κ΄€λ¦¬ν•˜κ³  μ½”λ“œ μ‹€ν–‰ μˆœμ„œλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ μŠ€νƒμœΌλ‘œ κ΄€λ¦¬ν•©λ‹ˆλ‹€.


μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒ

μ „μ—­ μ½”λ“œμ™€ ν•¨μˆ˜ μ½”λ“œλ‘œ 이루어진 μ½”λ“œκ°€ μžˆμ„ λ•Œ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 λ¨Όμ € μ „μ—­ μ½”λ“œλ₯Ό ν‰κ°€ν•˜μ—¬ μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•˜κ³  ν•¨μˆ˜κ°€ 호좜되면 ν•¨μˆ˜ μ½”λ“œλ₯Ό ν‰κ°€ν•˜μ—¬ ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. 

 

μ΄λ•Œ μƒμ„±λœ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ΄λΌλŠ” μŠ€νƒ 자료ꡬ쑰둜 κ΄€λ¦¬λ©λ‹ˆλ‹€.

 

const x = 1;

function foo () {
    const y = 2;
    
    function bar () {
        const z = 3;
        console.log(x + y + z);
    }
    bar();
}

foo(); // 6

 

μœ„ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ μ½”λ“œκ°€ μ‹€ν–‰λ˜λŠ” μ‹œκ°„μ˜ 흐름에 따라 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ—λŠ” λ‹€μŒκ³Ό 같이 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μΆ”κ°€λ˜κ³  μ œκ±°λ©λ‹ˆλ‹€.

 

 

  1. μ „μ—­ μ½”λ“œμ˜ 평가와 μ‹€ν–‰ : μ „μ—­ μ½”λ“œλ₯Ό ν‰κ°€ν•˜μ—¬ μƒμ„±λœ μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μŠ€νƒμ— push
  2. foo ν•¨μˆ˜ μ½”λ“œμ˜ 평가와 μ‹€ν–‰ : foo ν•¨μˆ˜ μ½”λ“œλ₯Ό ν‰κ°€ν•˜μ—¬ μƒμ„±λœ ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μŠ€νƒμ— push
  3. bar ν•¨μˆ˜ μ½”λ“œμ˜ 평가와 μ‹€ν–‰ : bar ν•¨μˆ˜ μ½”λ“œλ₯Ό ν‰κ°€ν•˜μ—¬ μƒμ„±λœ ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μŠ€νƒμ— push
  4. foo ν•¨μˆ˜ μ½”λ“œλ‘œ 볡귀 : bar ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μŠ€νƒμ—μ„œ pop ν•˜μ—¬ 제거
  5. μ „μ—­ μ½”λ“œλ‘œ 볡귀 : foo ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μŠ€νƒμ—μ„œ pop ν•˜κ³  μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ„ popν•˜μ—¬ 제거

이처럼 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ€ μ½”λ“œμ˜ μ‹€ν–‰ μˆœμ„œλ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€. λ˜ν•œ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ˜ μ΅œμƒμœ„μ— μ‘΄μž¬ν•˜λŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ–Έμ œλ‚˜ ν˜„μž¬ μ‹€ν–‰ 쀑인 μ½”λ“œμ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ‘œ 이λ₯Ό μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλΌκ³  λΆ€λ¦…λ‹ˆλ‹€.


λ ‰μ‹œμ»¬ ν™˜κ²½(Lexical Enviroment)

λ ‰μ‹œμ»¬ ν™˜κ²½μ€ μ‹λ³„μžμ™€ μ‹λ³„μžμ— λ°”μΈλ”©λœ κ°’, 그리고 μƒμœ„ μŠ€μ½”ν”„μ— λŒ€ν•œ μ°Έμ‘°λ₯Ό κΈ°λ‘ν•˜λŠ” 자료ꡬ쑰둜 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό κ΅¬μ„±ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈμž…λ‹ˆλ‹€.

 

 

λ ‰μ‹œμ»¬ ν™˜κ²½μ€ 킀와 값을 κ°–λŠ” 객체 ν˜•νƒœμ˜ μŠ€μ½”ν”„(μ „μ—­, ν•¨μˆ˜, 블둝 μŠ€μ½”ν”„)λ₯Ό μƒμ„±ν•˜μ—¬ μ‹λ³„μžλ₯Ό ν‚€λ‘œ λ“±λ‘ν•˜κ³  μ‹λ³„μžμ— λ°”μΈλ”©λœ 값을 κ΄€λ¦¬ν•˜λŠ” 즉, μŠ€μ½”ν”„λ₯Ό κ΅¬λΆ„ν•˜μ—¬ μ‹λ³„μžλ₯Ό λ“±λ‘ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” μ €μž₯μ†Œ 역할을 ν•˜λŠ” λ ‰μ‹œμ»¬ μŠ€μ½”ν”„μ˜ μ‹€μ²΄μž…λ‹ˆλ‹€.

 

λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ ꡬ성 μ»΄ν¬λ„ŒνŠΈ 2개

  1. ν™˜κ²½ λ ˆμ½”λ“œ : μŠ€μ½”ν”„μ— ν¬ν•¨λœ μ‹λ³„μžλ₯Ό λ“±λ‘ν•˜κ³  λ“±λ‘λœ μ‹λ³„μžμ— λ°”μΈλ”©λœ 값을 κ΄€λ¦¬ν•˜λŠ” μ €μž₯μ†Œ (μ†ŒμŠ€μ½”λ“œ νƒ€μž…μ— 따라 κ΄€λ¦¬ν•˜λŠ” λ‚΄μš©μ΄ 닀름)
  2. μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘° : μƒμœ„ μŠ€μ½”ν”„(μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½)λ₯Ό 기리켜 단방ν–₯ λ§ν¬λ“œ 리슀트인 μŠ€μ½”ν”„ 체인을 κ΅¬ν˜„

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ 생성과 μ‹λ³„μž 검색 κ³Όμ •

 λ‹€μŒ 예제의 과정을 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

var x = 1;
const y = 2;

function foo (a) {
    var x = 3;
    const y = 4;

    function bar (b) {
        const z = 5;
        console.log(a + b + x + y + z);
    }
    bar(10);
}

foo(20); // 42

 

μ „μ—­ 객체 생성

μ „μ—­ κ°μ²΄λŠ” μ „μ—­ μ½”λ“œκ°€ ν‰κ°€λ˜κΈ° 이전에 μƒμ„±λ˜μ–΄ 빌트인 μ „μ—­ ν”„λ‘œνΌν‹°, 빌트인 μ „μ—­ ν•¨μˆ˜, 호슀트 객체λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.

 

μ „μ—­ μ½”λ“œ 평가

μ†ŒμŠ€μ½”λ“œκ°€ λ‘œλ“œλ˜λ©΄ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ „μ—­ μ½”λ“œλ₯Ό λ‹€μŒκ³Ό 같은 μˆœμ„œλ‘œ ν‰κ°€ν•©λ‹ˆλ‹€.

  1. μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ 생성 : λΉ„μ–΄μžˆλŠ” μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•˜μ—¬ μŠ€νƒμ— push
  2. μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½ 생성 : μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— 바인딩
    1. μ „μ—­ ν™˜κ²½ λ ˆμ½”λ“œ 생성
      1. 객체 ν™˜κ²½ λ ˆμ½”λ“œ 생성 : var μ „μ—­ λ³€μˆ˜, μ „μ—­ ν•¨μˆ˜, 빌트인 μ „μ—­ ν”„λ‘œνΌν‹°/ν•¨μˆ˜, ν‘œμ€€ 빌트인 객체 관리
      2. 선언적 ν™˜κ²½ λ ˆμ½”λ“œ 생성 : let, const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜λ₯Ό 관리
    2. this 바인딩 : μ „μ—­ ν™˜κ²½ λ ˆμ½”λ“œμ˜ [[GlobalThisValue]] λ‚΄λΆ€ μŠ¬λ‘―μ— thisκ°€ 바인딩
    3. μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘° κ²°μ • : μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ°€λ¦¬μΌœ μŠ€μ½”ν”„ 체인을 κ΅¬ν˜„

μœ„ 과정을 톡해 μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ™€ λ ‰μ‹œμ»¬ ν™˜κ²½μ΄ λ‹€μŒκ³Ό 같이 μƒμ„±λ©λ‹ˆλ‹€.

 

 

μ „μ—­ μ½”λ“œ μ‹€ν–‰

μ „μ—­ μ½”λ“œλ₯Ό 순차적으둜 μ‹€ν–‰ν•˜λ©° λ³€μˆ˜μ— 값을 ν• λ‹Ήν•˜κ³  μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ μ‹λ³„μžλ₯Ό 검색을 톡해 μ‹λ³„μž 결정을 ν•©λ‹ˆλ‹€.

 

foo ν•¨μˆ˜ μ½”λ“œ 평가

foo ν•¨μˆ˜κ°€ 호좜되면 foo ν•¨μˆ˜ λ‚΄λΆ€λ‘œ μ½”λ“œμ˜ μ œμ–΄κΆŒμ΄ μ΄λ™λ˜μ–΄ ν•¨μˆ˜ μ½”λ“œλ₯Ό μ•„λž˜μ˜ μˆœμ„œλ‘œ ν‰κ°€ν•©λ‹ˆλ‹€.

  1. ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ 생성 : foo ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•˜μ—¬ ν•¨μˆ˜ λ ‰μ‹œμ»¨ ν™˜κ²½μ΄ μ™„μ„±λ˜λ©΄ μŠ€νƒμ— push
  2. ν•¨μˆ˜ λ ‰μ‹œμ»¬ ν™˜κ²½ 생성 : foo ν•¨μˆ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ foo ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— 바인딩
    1. ν•¨μˆ˜ ν™˜κ²½ λ ˆμ½”λ“œ 생성 : λ§€κ°œλ³€μˆ˜, arguments 객체, ν•¨μˆ˜ λ‚΄λΆ€ 지역 λ³€μˆ˜, 쀑첩 ν•¨μˆ˜λ₯Ό λ“±λ‘ν•˜κ³  관리
    2. this 바인딩 : ν•¨μˆ˜ ν™˜κ²½ λ ˆμ½”λ“œμ˜ [[ThisValue]] λ‚΄λΆ€ μŠ¬λ‘―μ— thisκ°€ 바인딩
    3. μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘° κ²°μ • : μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ μ°Έμ‘°κ°€ ν• λ‹Ή

foo ν•¨μˆ˜ μ½”λ“œ μ‹€ν–‰

λŸ°νƒ€μž„μ΄ μ‹œμž‘λ˜μ–΄ foo ν•¨μˆ˜μ˜ μ†ŒμŠ€μ½”λ“œλ₯Ό 순차적으둜 μ‹€ν–‰ν•˜λ©° 지역 λ³€μˆ˜μ— 값을 ν• λ‹Ήν•˜κ³  bar ν•¨μˆ˜κ°€ ν˜ΈμΆœλ©λ‹ˆλ‹€.

 

μ΄λ•Œ, μ‹λ³„μž 결정을 μœ„ν•΄ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ—μ„œ μ‹λ³„μžλ₯Ό κ²€μ‚­ν•˜μ—¬ foo ν•¨μˆ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ—μ„œ μ‹λ³„μž x, y λ₯Ό κ²€μƒ‰ν•˜κ³  μ‹λ³„μžμ— 값을 λ°”μΈλ”©ν•©λ‹ˆλ‹€.

 

bar ν•¨μˆ˜ μ½”λ“œ 평가

bar ν•¨μˆ˜κ°€ 호좜되면 bar ν•¨μˆ˜ λ‚΄λΆ€λ‘œ μ½”λ“œμ˜ μ œμ–΄κΆŒμ΄ μ΄λ™λ˜μ–΄ ν•¨μˆ˜ μ½”λ“œλ₯Ό foo ν•¨μˆ˜ μ½”λ“œ 평가와 λ™μΌν•˜κ²Œ ν‰κ°€ν•©λ‹ˆλ‹€.

 

bar ν•¨μˆ˜ μ½”λ“œ μ‹€ν–‰

λŸ°νƒ€μž„μ΄ μ‹œμž‘λ˜μ–΄ bar ν•¨μˆ˜μ˜ μ†ŒμŠ€μ½”λ“œλ₯Ό 순차적으둜 μ‹€ν–‰ν•˜λ©° λ§€κ°œλ³€μˆ˜μ— μΈμˆ˜κ°€ ν• λ‹Ήλ˜κ³ , λ³€μˆ˜ 할당문이 μ‹€ν–‰λ˜μ–΄ 지역 λ³€μˆ˜ z에 값이 ν• λ‹Ήλ˜μ–΄ console.log λ©”μ„œλ“œκ°€ μ‹€ν–‰λ©λ‹ˆλ‹€.

 

bar ν•¨μˆ˜ μ½”λ“œ μ‹€ν–‰ μ’…λ£Œ

bar ν•¨μˆ˜μ˜ 싀행이 μ’…λ£Œλ˜κ³  μŠ€νƒμ—μ„œ barκ°€ pop(제거)λ˜μ–΄ foo μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ λ©λ‹ˆλ‹€.

 

foo ν•¨μˆ˜ μ½”λ“œ μ‹€ν–‰ μ’…λ£Œ

foo ν•¨μˆ˜μ˜ 싀행이 μ’…λ£Œλ˜κ³  μŠ€νƒμ—μ„œ fooκ°€ pop(제거)λ˜μ–΄ μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ λ©λ‹ˆλ‹€.

 

μ „μ—­ μ½”λ“œ μ‹€ν–‰ μ’…λ£Œ

더 이상 μ‹€ν–‰ν•  μ „μ—­ μ½”λ“œκ°€ μ—†μœΌλ―€λ‘œ μ „μ—­ μ½”λ“œμ˜ 싀행이 μ’…λ£Œλ˜κ³  μŠ€νƒμ—μ„œ μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ„ popλ©λ‹ˆλ‹€.


μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ™€ 블둝 레벨 μŠ€μ½”ν”„

let, const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λͺ¨λ“  μ½”λ“œ 블둝을 지역 μŠ€μ½”ν”„λ‘œ μΈμ •ν•˜λŠ” 블둝 레벨 μŠ€μ½”ν”„λ₯Ό λ”°λ¦…λ‹ˆλ‹€.

 

let x = 1;

if(true) {
    let x = 10;
    cosole.log(x); // 10
}

console.log(x); // 1

 

λ”°λΌμ„œ μœ„ μ˜ˆμ œμ™€ 같이 if 문이 μ‹€ν–‰λ˜λ©΄ if 문의 μ½”λ“œ 블둝을 μœ„ν•œ 블둝 레벨 μŠ€μ½”ν”„λ₯Ό 생성해야 ν•©λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄ 선언적 ν™˜κ²½ λ ˆμ½”λ“œλ₯Ό κ°–λŠ” 독립적인 λ ‰μ‹œμ»¬ ν™˜κ²½μ„ μƒˆλ‘­κ²Œ μƒμ„±ν•˜μ—¬ 기쑴의 μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ κ΅μ²΄ν•©λ‹ˆλ‹€.

 

μ΄λ•Œ, if 문의 μ½”λ“œ 블둝을 μœ„ν•œ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°λŠ” if 문이 μ‹€ν–‰λ˜κΈ° μ΄μ „μ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ κ°€λ¦¬ν‚΅λ‹ˆλ‹€. ( μœ„ μ˜ˆμ œμ—μ„œλŠ” 이전 ν™˜κ²½μ€ μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½ )


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

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

 

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

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

wikibook.co.kr

 

'JavaScript > λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[JavaScript] 클래슀  (0) 2022.07.28
[JavaScript] ν΄λ‘œμ €  (0) 2022.07.27
[JavaScript] this  (0) 2022.07.26
[JavaScript] 빌트인 객체  (0) 2022.07.25
[JavaScript] strict mode  (0) 2022.07.24