Skip to content

Commit

Permalink
Merge pull request #949 from yui880/yui880
Browse files Browse the repository at this point in the history
23-2μž₯ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ - κΉ€μœ λ‚˜
  • Loading branch information
Ryan-Dia authored Dec 11, 2023
2 parents 40d4e70 + aa3f910 commit cb024eb
Showing 1 changed file with 121 additions and 0 deletions.
121 changes: 121 additions & 0 deletions docs/23_μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ/κΉ€μœ λ‚˜.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,3 +60,124 @@ x = 1;
2. μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ x λ³€μˆ˜κ°€ λ“±λ‘λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€.
3. x λ³€μˆ˜κ°€ λ“±λ‘λ˜μ–΄ 있으면 값을 ν• λ‹Ήν•˜κ³ , ν• λ‹Ή κ²°κ³Όλ₯Ό μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— λ“±λ‘ν•œλ‹€.


---
## 23.3 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ μ—­ν• 
```js
const x = 1;
const y = 2;

function foo(a){
const x = 10;
const y = 20;

console.log(a + x + y);
}

foo(100);

console.log(x+y);
```

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

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

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

#### 4. ν•¨μˆ˜ μ½”λ“œ μ‹€ν–‰
ν•¨μˆ˜ μ½”λ“œ 평가 과정이 λλ‚˜λ©΄ λŸ°νƒ€μž„μ΄ μ‹œμž‘λ˜μ–΄ ν•¨μˆ˜ μ½”λ“œκ°€ 순차적으둜 μ‹€ν–‰λ˜κΈ° μ‹œμž‘ν•œλ‹€.
이떄 μ½”λ“œμ˜ `console.log` λ©”μ„œλ“œκ°€ ν˜ΈμΆœλœλ‹€. 이 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κΈ° μœ„ν•΄ λ¨Όμ € μ‹λ³„μžμΈ `console`을 μŠ€μ½”ν”„ 체인을 톡해 κ²€μƒ‰ν•œλ‹€.
이λ₯Ό μœ„ν•΄ ν•¨μˆ˜ μ½”λ“œμ˜ 지역 μŠ€μ½”ν”„λŠ” μƒμœ„ μŠ€μ½”ν”„μΈ μ „μ—­ μŠ€μ½”ν”„μ™€ μ—°κ²°λ˜μ–΄μ•Ό ν•œλ‹€. ν•˜μ§€λ§Œ `console` μ‹λ³„μžλŠ” μ „μ—­ 객체에 ν”„λ‘œνΌν‹°λ‘œ μ‘΄μž¬ν•œλ‹€.
μ΄λŠ” **μ „μ—­ 객체의 ν”„λ‘œνΌν‹°κ°€ 마치 μ „μ—­ λ³€μˆ˜μ²˜λŸΌ μ „μ—­ μŠ€μ½”ν”„λ₯Ό 톡해 검색 κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€λŠ” 것**을 μ˜λ―Έν•œλ‹€.


λ˜ν•œ ν•¨μˆ˜ 호좜이 μ’…λ£Œλ˜λ©΄ ν•¨μˆ˜ 호좜 μ΄μ „μœΌλ‘œ λŒμ•„κ°€μ•Όν•˜λ‹ˆ ν˜„μž¬ 싀행쀑인 μ½”λ“œμ™€ 이전에 μ‹€ν–‰ν•˜λ˜ μ½”λ“œλ₯Ό κ΅¬λΆ„ν•΄μ„œ 관리해야 ν•œλ‹€.

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

> μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ : μ†ŒμŠ€ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ”λ° ν•„μš”ν•œ ν™˜κ²½μ„ μ œκ³΅ν•˜κ³  μ½”λ“œμ˜ μ‹€ν–‰ κ²°κ³Όλ₯Ό μ‹€μ œλ‘œ κ΄€λ¦¬ν•˜λŠ” μ˜μ—­
- μ‹λ³„μžλ₯Ό λ“±λ‘ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” μŠ€μ½”ν”„μ™€ μ½”λ“œ μ‹€ν–‰ μˆœμ„œ 관리λ₯Ό κ΅¬ν˜„ν•œ λ‚΄λΆ€ λ§€μ»€λ‹ˆμ¦˜μœΌλ‘œ λͺ¨λ“  μ½”λ“œλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό 톡해 μ‹€ν–‰λ˜κ³  κ΄€λ¦¬λœλ‹€.
- μ‹λ³„μžμ™€ μŠ€μ½”ν”„λŠ” λ ‰μ‹œμ»¬ ν™˜κ²½, μ½”λ“œ μ‹€ν–‰ μˆœμ„œλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμœΌλ‘œ κ΄€λ¦¬ν•œλ‹€.

---
## 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`κ°€ λ“±λ‘λ˜κ³ , μ½”λ“œκ°€ μ‹€ν–‰λ˜λ©΄μ„œ `y`에 값이 ν• λ‹Ήλ˜κ³  쀑첩 ν•¨μˆ˜ `bar`κ°€ ν˜ΈμΆœλœλ‹€.

#### 3. bar ν•¨μˆ˜ μ½”λ“œμ˜ 평가와 μ‹€ν–‰
`bar`κ°€ μ‹€ν–‰λ˜λ©΄ `foo` ν•¨μˆ˜ μ½”λ“œμ˜ 싀행은 μΌμ‹œ μ€‘λ‹¨λ˜λ„ μ½”λ“œμ˜ μ œμ–΄κΆŒμ΄ `bar` ν•¨μˆ˜ λ‚΄λΆ€λ‘œ μ΄λ™ν•œλ‹€.
bar ν•¨μˆ˜ λ‚΄λΆ€μ˜ μ½”λ“œλ₯Ό ν‰κ°€ν•˜μ—¬ bar ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•˜κ³  μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ— ν‘Έμ‹œν•œλ‹€.
μ΄λ•Œ `z`κ°€ λ“±λ‘λ˜κ³ , μ½”λ“œκ°€ μ‹€ν–‰ν•˜λ©΄μ„œ z에 값이 ν• λ‹Ήλ˜κ³  `console.log` λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κ³  μ’…λ£Œλœλ‹€.

#### 4. foo ν•¨μˆ˜ μ½”λ“œλ‘œ 볡귀
μ œμ–΄κΆŒμ€ λ‹€μ‹œ `foo` ν•¨μˆ˜λ‘œ μ΄λ™ν•˜κ³ , `bar` ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό pop ν•œλ‹€.
더이상 μ‹€ν–‰ν•  μ½”λ“œκ°€ μ—†μœΌλ―€λ‘œ μ’…λ£Œλœλ‹€.

#### 5. μ „μ—­ μ½”λ“œλ‘œ 볡귀
μ½”λ“œμ˜ μ œμ–΄κΆŒμ€ λ‹€μ‹œ μ „μ—­ μ½”λ“œλ‘œ μ΄λ™ν•˜κ³ , `foo` ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό `pop` ν•œλ‹€.
더 이상 μ‹€ν–‰ν•  μ „μ—­ μ½”λ“œκ°€ λ‚¨μ•„μžˆμ§€ μ•ŠμœΌλ―€λ‘œ μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ„ `pop`ν•΄μ„œ μŠ€νƒμ—λŠ” 아무것도 λ‚¨μ•„μžˆμ§€ μ•Šκ²Œ λœλ‹€.


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


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

### λ ‰μ‹œμ»¬ ν™˜κ²½
- μ‹λ³„μžμ— λ°”μΈλ”©λœ κ°’, μƒμœ„ μŠ€μ½”ν”„μ— λŒ€ν•œ μ°Έμ‘°λ₯Ό κΈ°λ‘ν•˜λŠ” 자료ꡬ쑰둜 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό κ΅¬μ„±ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈμ΄λ‹€.
- 킀와 값을 κ°–λŠ” 객체 ν˜•νƒœμ˜ μŠ€μ½”ν”„λ₯Ό μƒμ„±ν•˜μ—¬ μ‹λ³„μžλ₯Ό ν‚€λ‘œ λ“±λ‘ν•˜κ³ , μ‹λ³„μžμ— λ°”μΈλ”©λœ 값을 κ΄€λ¦¬ν•œλ‹€.

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” `LexicalEnvironment`와 `VariableEnvironment`둜 κ΅¬μ„±λœλ‹€.
생성 μ΄ˆκΈ°μ— `LexicalEnvironment`와 `VariableEnvironment`λŠ” ν•˜λ‚˜μ˜ λ™μΌν•œ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ μ°Έμ‘°ν•œλ‹€.
이후에 `LexicalEnvironment`λ₯Ό μœ„ν•œ μƒˆλ‘œμš΄ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ μƒμ„±ν•˜λ©° `VariableEnvironment`λŠ” λ‚΄μš©μ΄ λ‹¬λΌμ§€λŠ” κ²½μš°λ„ μžˆλ‹€.

### λ ‰μ‹œμ»¬ ν™˜κ²½ ꡬ성
1. ν™˜κ²½ λ ˆμ½”λ“œ
- μŠ€μ½”ν”„μ— ν¬ν•¨λœ λͺ¨λ“  μ‹λ³„μžλ₯Ό λ“±λ‘ν•˜κ³  λ“±λ‘λœ μ‹λ³„μžμ— λ°”μΈλ”©λœ 값을 κ΄€λ¦¬ν•˜λŠ” μ‘°μž₯μ†Œ.
- ν™˜κ²½ λ ˆμ½”λ“œλŠ” μ†ŒμŠ€ μ½”λ“œμ˜ νƒ€μž…μ— 따라 κ΄€λ¦¬ν•˜λŠ” λ‚΄μš©μ— 차이가 μžˆλ‹€.

2. μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°
- μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°λŠ” μƒμœ„ μŠ€μ½”ν”„λ₯Ό 가리킨닀. μƒμœ„ μŠ€μ½”ν”„λž€ ν•΄λ‹Ή μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•œ μ†ŒμŠ€μ½”λ“œλ₯Ό ν¬ν•¨ν•˜λŠ” μƒμœ„ μ½”λ“œμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ λ§ν•œλ‹€.
- μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°λ₯Ό 톡해 단방ν–₯ λ§ν¬λ“œ 리슀트인 μŠ€μ½”ν”„ 체인을 κ΅¬μ„±ν•œλ‹€.

0 comments on commit cb024eb

Please sign in to comment.