Skip to content

Commit

Permalink
docs: 23.3~23.5 정리
Browse files Browse the repository at this point in the history
  • Loading branch information
gaeaeg committed Dec 10, 2023
1 parent 45b5f49 commit df43cbd
Showing 1 changed file with 104 additions and 0 deletions.
104 changes: 104 additions & 0 deletions docs/23_μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ/κΉ€κ²½μ£Ό.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,3 +65,107 @@ x = 1;
λ³€μˆ˜ μ„ μ–Έλ¬Έ `var x;`λŠ” μ†ŒμŠ€μ½”λ“œ 평가 κ³Όμ •μ—μ„œ 이미 μ‹€ν–‰ μ™„λ£Œλ˜μ—ˆκΈ° λ•Œλ¬Έμ— μ†ŒμŠ€μ½”λ“œ μ‹€ν–‰ κ³Όμ •μ—μ„œλŠ” λ³€μˆ˜ν• λ‹Ήλ¬Έ `x = 1;`만 μ‹€ν–‰λœλ‹€.
μ΄λ•Œ `x` λ³€μˆ˜μ— 값을 ν• λ‹Ήν•˜λ €λ©΄ λ¨Όμ € `x` λ³€μˆ˜κ°€ μ„ μ–Έλœ λ³€μˆ˜μΈμ§€ 확인해야 ν•œλ‹€.<br>
`x` λ³€μˆ˜κ°€ μ„ μ–Έλœ λ³€μˆ˜λΌλ©΄ 값을 ν• λ‹Ήν•˜κ³  ν• λ‹Ή κ²°κ³Όλ₯Ό μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— 등둝해 κ΄€λ¦¬ν•œλ‹€.

<br>

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

---

```js
// μ „μ—­ λ³€μˆ˜ μ„ μ–Έ
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
```

##### 1. μ „μ—­ μ½”λ“œ 평가

μ „μ—­ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° 전에 μ „μ—­ μ½”λ“œ 평가 과정을 거치며 μ„ μ–Έλ¬Έλ§Œ λ¨Όμ € μ‹€ν–‰ν•œλ‹€. λ”°λΌμ„œ μ „μ—­ μ½”λ“œμ˜ λ³€μˆ˜ μ„ μ–Έλ¬Έκ³Ό ν•¨μˆ˜ 선언문이 λ¨Όμ € μ‹€ν–‰λ˜κ³ , κ·Έ κ²°κ³Ό μƒμ„±λœ μ „μ—­ λ³€μˆ˜μ™€ μ „μ—­ ν•¨μˆ˜κ°€ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ κ΄€λ¦¬ν•˜λŠ” μ „μ—­ μŠ€μ½”ν”„μ— λ“±λ‘λœλ‹€. μ΄λ•Œ `var` ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ μ „μ—­ λ³€μˆ˜μ™€ ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜λœ μ „μ—­ ν•¨μˆ˜λŠ” μ „μ—­ 객체의 ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œκ°€ λœλ‹€.

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

μ „μ—­ μ½”λ“œ 평가가 λλ‚˜λ©΄ λŸ°νƒ€μž„μ΄ μ‹œμž‘λ˜μ–΄ μ „μ—­ μ½”λ“œκ°€ 순차적으둜 μ‹€ν–‰λœλ‹€. μ΄λ•Œ μ „μ—­ λ³€μˆ˜μ— 값이 ν• λ‹Ήλ˜κ³  ν•¨μˆ˜κ°€ ν˜ΈμΆœλœλ‹€. ν•¨μˆ˜κ°€ 호좜되면 μ „μ—­ μ½”λ“œμ˜ 싀행을 μΌμ‹œ μ€‘λ‹¨ν•˜κ³  μ½”λ“œ μ‹€ν–‰ μˆœμ„œλ₯Ό λ³€κ²½ν•˜μ—¬ ν•¨μˆ˜ λ‚΄λΆ€λ‘œ μ§„μž…ν•œλ‹€.

##### 3. ν•¨μˆ˜ μ½”λ“œ 평가

ν•¨μˆ˜ λ‚΄λΆ€λ‘œ μ§„μž…ν•˜λ©΄ ν•¨μˆ˜ λ‚΄λΆ€μ˜ 문듀을 μ‹€ν–‰ν•˜κΈ°μ— 전에 ν•¨μˆ˜ μ½”λ“œ 평가 과정을 거치며 ν•¨μˆ˜ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•œ μ€€λΉ„λ₯Ό ν•œλ‹€. μ΄λ•Œ λ§€κ°œλ³€μˆ˜μ™€ 지역 λ³€μˆ˜ 선언문이 λ¨Όμ € μ‹€ν–‰λ˜κ³ , κ·Έ κ²°κ³Ό μƒμ„±λœ λ§€κ°œλ³€μˆ˜μ™€ 지역 λ³€μˆ˜κ°€ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ κ΄€λ¦¬ν•˜λŠ” 지역 μŠ€μ½”ν”„μ— λ“±λ‘λœλ‹€. λ˜ν•œ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ 지역 λ³€μˆ˜μ²˜λŸΌ μ‚¬μš©ν•  수 μžˆλŠ” `arguments` 객체가 μƒμ„±λ˜μ–΄ 지역 μŠ€μ½”ν”„μ— λ“±λ‘λ˜κ³  `this` 바인딩도 κ²°μ •λœλ‹€.

##### 4. ν•¨μˆ˜ μ½”λ“œ μ‹€ν–‰

ν•¨μˆ˜ μ½”λ“œ 평가 과정이 λλ‚˜λ©΄ λŸ°νƒ€μž„μ΄ μ‹œμž‘λ˜μ–΄ ν•¨μˆ˜ μ½”λ“œκ°€ 순차적으둜 μ‹€ν–‰λœλ‹€. **μ½”λ“œκ°€ μ‹€ν–‰λ˜λ €λ©΄ λ‹€μŒκ³Ό 같이 μŠ€μ½”ν”„, μ‹λ³„μž, μ½”λ“œ μ‹€ν–‰ μˆœμ„œ λ“±μ˜ 관리가 ν•„μš”**ν•˜λ‹€.

1. 선언에 μ˜ν•΄ μƒμ„±λœ λͺ¨λ“  μ‹λ³„μž(λ³€μˆ˜, ν•¨μˆ˜, 클래슀)의 μŠ€μ½”ν”„λ₯Ό κ΅¬λΆ„ν•˜μ—¬ λ“±λ‘ν•˜κ³  μƒνƒœ λ³€ν™”(μ‹λ³„μžμ— λ°”μΈλ”©λœ κ°’μ˜ λ³€ν™”)λ₯Ό μ§€μ†μ μœΌλ‘œ 관리할 수 μžˆμ–΄μ•Ό ν•œλ‹€.
2. μŠ€μ½”ν”„λŠ” 쀑첩 관계에 μ˜ν•΄ μŠ€μ½”ν”„λ₯Ό ν˜•μ„±ν•΄μ•Ό ν•œλ‹€.
3. ν˜„μž¬ μ‹€ν–‰ 쀑인 μ½”λ“œμ˜ μ‹€ν–‰ μˆœμ„œλ₯Ό λ³€κ²½ν•  수 μžˆμ–΄ν– ν•˜λ©° λ‹€μ‹œ λŒμ•„κ°ˆ μˆ˜λ„ μžˆμ–΄μ•Ό ν•œλ‹€.

이 λͺ¨λ“  것을 κ΄€λ¦¬ν•˜λŠ” 것이 **μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ**λ‹€. **μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ†ŒμŠ€μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 데 ν•„μš”ν•œ ν™˜κ²½μ„ μ œκ³΅ν•˜κ³  μ½”λ“œμ˜ μ‹€ν–‰ κ²°κ³Όλ₯Ό μ‹€μ œλ‘œ κ΄€λ¦¬ν•˜λŠ” μ˜μ—­**이닀.
ꡬ체적으둜 말해, μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ‹λ³„μž(λ³€μˆ˜, ν•¨μˆ˜, 클래슀 λ“±μ˜ 이름)λ₯Ό λ“±λ‘ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” μŠ€μ½”ν”„μ™€ μ½”λ“œ μ‹€ν–‰ μˆœμ„œ 관리λ₯Ό κ΅¬ν˜„ν•œ λ‚΄λΆ€ λ©”μ»€λ‹ˆμ¦˜μœΌλ‘œ, λͺ¨λ“  μ½”λ“œλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό 톡해 μ‹€ν–‰λ˜κ³  κ΄€λ¦¬λœλ‹€.

<br>

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

```js
const x = 1;
function foo() {
const y = 2;

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

foo(); // 6
```

##### 1. μ „μ—­ μ½”λ“œμ˜ 평가와 μ‹€ν–‰

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 λ¨Όμ € μ €μ—­ μ½”λ“œλ₯Ό ν‰κ°€ν•˜μ—¬ μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•˜κ³  μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ— ν‘Έμ‹œν•œλ‹€. μ΄λ•Œ μ „μ—­λ³€μˆ˜ `x`와 μ „μ—­ ν•¨μˆ˜ `foo`λŠ” μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— λ“±λ‘λœλ‹€. 이후 μ „μ—­ μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ° μ‹œμž‘ν•˜μ—¬ μ „μ—­ λ³€μˆ˜ `x`에 값이 ν• λ‹Ήλ˜κ³  μ „μ—­ ν•¨μˆ˜ `foo`κ°€ ν˜ΈμΆœλœλ‹€.

##### 2. foo ν•¨μˆ˜ μ½”λ“œμ˜ 평가와 μ‹€ν–‰

μ „μ—­ ν•¨μˆ˜ `foo`κ°€ 호좜되면 μ „μ—­ μ½”λ“œμ˜ 싀행은 μΌμ‹œ μ€‘λ‹¨λ˜κ³  μ½”λ“œμ˜ μ œμ–΄κΆŒμ΄ `foo` ν•¨μˆ˜ λ‚΄λΆ€λ‘œ μ΄λ™ν•œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 `foo` ν•¨μˆ˜ λ‚΄λΆ€μ˜ ν•¨μˆ˜ μ½”λ“œλ₯Ό ν‰κ°€ν•˜μ—¬ `foo` ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•˜κ³  μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ— ν‘Έμ‹œν•œλ‹€. 지역 λ³€μˆ˜ `y`와 쀑첩 ν•¨μˆ˜ `bar`κ°€ `foo` ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— λ“±λ‘λœ ν›„ μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ° μ‹œμž‘ν•˜μ—¬ 지역 λ³€μˆ˜ `y`에 값이 ν• λ‹Ήλ˜κ³  쀑첩 ν•¨μˆ˜ `bar`κ°€ ν˜ΈμΆœλœλ‹€.

##### 3. bar ν•¨μˆ˜ μ½”λ“œμ˜ 평가와 μ‹€ν–‰

μ€‘μ²©ν•¨μˆ˜ `bar`κ°€ 호좜되면 μ½”λ“œμ˜ μ œμ–΄κΆŒμ΄ `bar` ν•¨μˆ˜ λ‚΄λΆ€λ‘œ μ΄λ™ν•œλ‹€. `bar` ν•¨μˆ˜μ˜ 지역 λ³€μˆ˜ `z`κ°€ `bar` ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— λ“±λ‘λœ ν›„ ν•¨μˆ˜ μ½”λ“œκ°€ μ‹€ν–‰λ˜μ–΄ 지역 λ³€μˆ˜ `z`에 값이 ν• λ‹Ήλ˜κ³  `console.log` λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ 이후 `bar` ν•¨μˆ˜λŠ” μ’…λ£Œλœλ‹€.

##### 4. foo ν•¨μˆ˜ μ½”λ“œλ‘œ 볡귀

`bar` ν•¨μˆ˜κ°€ μ’…λ£Œλ˜λ©΄ μ½”λ“œμ˜ μ œμ–΄κΆŒμ€ λ‹€μ‹œ `foo` ν•¨μˆ˜λ‘œ μ΄λ™ν•œλ‹€. μ΄λ•Œ `bar` ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μ‹€ν–‰ν•œ μ»¨ν…μŠ€νŠΈλ₯Ό μŠ€νƒμ—μ„œ 팝 ν•˜μ—¬ μ œκ±°ν•œλ‹€. 그리고 더 이상 μ‹€ν–‰ν•  μ½”λ“œκ°€ μ—†μœΌλ―€λ‘œ μ’…λ£Œλœλ‹€.

##### 5. μ „μ—­ μ½”λ“œλ‘œ 볡귀

`foo` ν•¨μˆ˜κ°€ μ’…λ£Œλ˜λ©΄ μ½”λ“œμ˜ μ œμ–΄κΆŒμ€ λ‹€μ‹œ μ „μ—­ μ½”λ“œλ‘œ μ΄λ™ν•œλ‹€. μ΄λ•Œ `foo` ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ—μ„œ νŒν•˜μ—¬ μ œκ±°ν•œλ‹€. 그리고 더 이상 μ‹€ν–‰ν•  μ „μ—­ μ½”λ“œκ°€ μ—†μœΌλ―€λ‘œ μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ„ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ—μ„œ 팝 λ˜μ–΄ 아무것도 λ‚¨μ•„μžˆμ§€ μ•Šκ²Œ λœλ‹€.

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

<br>

### 23.5 λ ‰μ‹œμ»¬ ν™˜κ²½

μ‹λ³„μžμ™€ μ‹λ³„μžμ— 바인딩 된 κ°’, 그리고 μƒμœ„ μŠ€μ½”ν”„μ— λŒ€ν•œ μ°Έμ‘°λ₯Ό κΈ°λ‘ν•˜λŠ” 자료ꡬ쑰둜 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό κ΅¬μ„±ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈλ‹€.
λ ‰μ‹œμ»¬ ν™˜κ²½μ€ 킀와 값을 κ°–λŠ” 객체 ν˜•νƒœμ˜ μŠ€μ½”ν”„λ₯Ό μƒμ„±ν•˜μ—¬ μ‹λ³„μžλ₯Ό ν‚€λ‘œ λ“±λ‘ν•˜κ³  μ‹λ³„μžμ— 바인딩 된 값을 κ΄€λ¦¬ν•œλ‹€.<br>
μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” `LexicalEnvironment` μ»΄ν¬λ„ŒνŠΈμ™€ `VariableEnvironment` μ»΄ν¬λ„ŒνŠΈλ‘œ κ΅¬μ„±λœλ‹€.<br>
λ ‰μ‹œμ»¬ ν™˜κ²½μ€ λ‹€μŒκ³Ό 같이 두 개의 μ»΄ν¬λ„ŒνŠΈλ‘œ κ΅¬λΆ„λœλ‹€.

1. ν™˜κ²½λ ˆμ½”λ“œ(`Environment Record`): μŠ€μ½”ν”„μ— ν¬ν•¨λœ μ‹λ³„μžλ₯Ό λ“±λ‘ν•˜κ³  λ“±λ‘λœ μ‹λ³„μžμ— 바인딩 된 값을 κ΄€λ¦¬ν•˜λŠ” μ €μž₯μ†Œλ‹€.
2. μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°(`Outer Lexical Environment Record`): μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°λŠ” μƒμœ„ μŠ€μ½”ν”„λ₯Ό 가리킨닀. μ΄λ•Œ μƒμœ„ μŠ€μ½”ν”„λž€ μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½, 즉 ν•΄λ‹Ή μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•œ μ†ŒμŠ€μ½”λ“œλ₯Ό ν¬ν•¨ν•˜λŠ” μƒμœ„ μ½”λ“œμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ λ§ν•œλ‹€.

0 comments on commit df43cbd

Please sign in to comment.