Skip to content

Commit

Permalink
docs: 23.6 정리
Browse files Browse the repository at this point in the history
  • Loading branch information
e6d1fe committed Dec 11, 2023
1 parent ee130f2 commit faa1297
Showing 1 changed file with 141 additions and 0 deletions.
141 changes: 141 additions & 0 deletions docs/23_μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ/λ‚˜μ„Έν˜„.md
Original file line number Diff line number Diff line change
Expand Up @@ -163,3 +163,144 @@ foo(); // 6

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

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

```javascript
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
```

#### μ „μ—­ 객체 생성

μ „μ—­ κ°μ²΄λŠ” μ „μ—­ μ½”λ“œκ°€ ν‰κ°€λ˜κΈ° 이전에 μƒμ„±λœλ‹€.
μ΄λ•Œ μ „μ—­ κ°μ²΄μ—λŠ” 빌트인 μ „μ—­ ν”„λ‘œνΌν‹°μ™€ 빌트인 μ „μ—­ ν•¨μˆ˜, 그리고 ν‘œμ€€ 빌트인 객체가 μΆ”κ°€λ˜λ©° λ™μž‘ ν™˜κ²½μ— 따라 ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œ Web API λ˜λŠ” νŠΉμ • ν™˜κ²½μ„ μœ„ν•œ 호슀트 객체λ₯Ό ν¬ν•¨ν•œλ‹€.
μ „μ—­ 객체도 `Object.prototype`을 μƒμ†λ°›λŠ”λ‹€.

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

μ „μ—­ μ½”λ“œ ν‰κ°€λŠ” λ‹€μŒκ³Ό 같은 μˆœμ„œλ‘œ 이루어진닀.

1. μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ 생성
2. μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½ 생성
1. μ „μ—­ ν™˜κ²½ λ ˆμ½”λ“œ 생성
1. 객체 ν™˜κ²½ λ ˆμ½”λ“œ 생성
2. 선언적 ν™˜κ²½ λ ˆμ½”λ“œ 생성
2. `this` 바인딩
3. μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘° κ²°μ •

##### πŸ“ 1. μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ 생성

λΉ„μ–΄ μžˆλŠ” μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό 생성해 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ— ν‘Έμ‹œν•œλ‹€.

##### πŸ“ 2. μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½ 생성

μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ μƒμ„±ν•˜κ³  μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— λ°”μΈλ”©ν•œλ‹€.
μ΄λŠ” ν™˜κ²½ λ ˆμ½”λ“œμ™€ μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°λΌλŠ” 두 개의 μ»΄ν¬λ„ŒνŠΈλ‘œ κ΅¬μ„±λœλ‹€.

##### πŸ“ 2.1. μ „μ—­ ν™˜κ²½ λ ˆμ½”λ“œ 생성

μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ κ΅¬μ„±ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈμΈ μ „μ—­ ν™˜κ²½ λ ˆμ½”λ“œλŠ” μ „μ—­ λ³€μˆ˜λ₯Ό κ΄€λ¦¬ν•˜λŠ” μ „μ—­ μŠ€μ½”ν”„, μ „μ—­ 객체의 빌트인 μ „μ—­ ν”„λ‘œνΌν‹°μ™€ 빌트인 μ „μ—­ ν•¨μˆ˜, ν‘œμ€€ 빌트인 객체λ₯Ό μ œκ³΅ν•œλ‹€.
`var` ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜(μ „μ—­ 객체의 ν”„λ‘œνΌν‹°κ°€ 됨)와 `let`, `const` ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜λ₯Ό ꡬ뢄해 관리학 μœ„ν•΄μ„œ μ „μ—­ μŠ€μ½”ν”„ 역할을 ν•˜λŠ” μ „μ—­ ν™˜κ²½ λ ˆμ½”λ“œλŠ” **객체 ν™˜κ²½ λ ˆμ½”λ“œ**와 **선언적 ν™˜κ²½ λ ˆμ½”λ“œ**둜 κ΅¬λΆ„λ˜μ–΄ μžˆλ‹€.
객체 ν™˜κ²½ λ ˆμ½”λ“œλŠ” 기쑴의 μ „μ—­ 객체가 κ΄€λ¦¬ν•˜λ˜ `var` ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜μ™€ ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜ν•œ μ „μ—­ ν•¨μˆ˜, 빌트인 μ „μ—­ ν”„λ‘œνΌν‹°μ™€ 빌트인 μ „μ—­ ν•¨μˆ˜, ν‘œμ€€ 빌트인 객체λ₯Ό κ΄€λ¦¬ν•œλ‹€.
선언적 ν™˜κ²½ λ ˆμ½”λ“œλŠ” `let`, `const`둜 μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜λ₯Ό κ΄€λ¦¬ν•œλ‹€.
즉, 이 λ‘˜μ€ μ„œλ‘œ ν˜‘λ ₯ν•΄ μ „μ—­ μŠ€μ½”ν”„μ™€ μ „μ—­ 객체λ₯Ό κ΄€λ¦¬ν•œλ‹€.

##### πŸ“ 2.1.1. 객체 ν™˜κ²½ λ ˆμ½”λ“œ 생성

객체 ν™˜κ²½ λ ˆμ½”λ“œλŠ” `BindingObject`λΌλŠ” 객체와 μ—°κ²°λ˜λŠ”λ°, μ΄λŠ” μ „μ—­ 객체 생성 μ‹œμ— μƒμ„±λœ μ „μ—­ 객체이닀.
**μ „μ—­ μ½”λ“œ 평가 κ³Όμ •μ—μ„œ `var` ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜μ™€ ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜λœ μ „μ—­ ν•¨μˆ˜λŠ” μ „μ—­ ν™˜κ²½ λ ˆμ½”λ“œμ˜ 객체 ν™˜κ²½ λ ˆμ½”λ“œμ— μ—°κ²°λœ `BindingObject`λ₯Ό 톡해 μ „μ—­ 객체의 ν”„λ‘œνΌν‹°μ™€ λ©”μ†Œλ“œκ°€ λœλ‹€.**
μ΄λ•Œ λ“±λ‘λœ μ‹λ³„μžλ₯Ό μ „μ—­ ν™˜κ²½ λ ˆμ½”λ“œμ˜ 객체 ν™˜κ²½ λ ˆμ½”λ“œμ—μ„œ κ²€μƒ‰ν•˜λ©΄ μ „μ—­ 객체의 ν”„λ‘œνΌν‹°λ₯Ό 검색해 λ°˜ν™˜ν•œλ‹€.
μœ„ 예제의 μ „μ—­ λ³€μˆ˜ `x`와 μ „μ—­ ν•¨μˆ˜ `foo`λŠ” 이 과저을 톡해 객체 ν™˜κ²½ λ ˆμ½”λ“œμ˜ `BindingObject`에 λ°”μΈλ”©λ˜μ–΄ μžˆλŠ” μ „μ—­ 객체의 ν”„λ‘œνΌν‹°κ°€ λ©”μ„œλ“œκ°€ λœλ‹€.

##### πŸ“ 2.1.2. 선언적 ν™˜κ²½ λ ˆμ½”λ“œ 생성

μœ„ 예제의 μ „μ—­ λ³€μˆ˜ `y`λŠ” `let`, `const` ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜μ΄λ―€λ‘œ μ „μ—­ 객체의 ν”„λ‘œνΌν‹°κ°€ λ˜μ§€ μ•ŠκΈ°μ— `window.y`처럼 μ „μ—­ 객체의 ν”„λ‘œνΌν‹°λ‘œμ„œ μ°Έμ‘°ν•  수 μ—†λ‹€.
λ˜ν•œ `const` ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ„ μ–Έ 단계와 μ΄ˆκΈ°ν™” 단계가 λΆ„λ¦¬λ˜μ–΄ μ§„ν–‰λ˜κΈ° λ•Œλ¬Έμ— λŸ°νƒ€μž„μ— μ‹€ν–‰ 흐름이 λ³€μˆ˜ 선언문에 λ„λ‹¬ν•˜κΈ° μ „κΉŒμ§€ μΌμ‹œμ  μ‚¬κ°μ§€λŒ€μ— λΉ μ§€κ²Œ λœλ‹€.
**`let`, `const` ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λ„ λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜λŠ” 것은 변함이 μ—†λ‹€.**
**ν•˜μ§€λ§Œ μ΄λ ‡κ²Œ μ„ μ–Έν•œ λ³€μˆ˜λ“€μ€ λŸ°νƒ€μž„μ— 컨트둀이 λ³€μˆ˜ 선언문에 도달할 λ•ŒκΉŒμ§€ μ΄ˆκΈ°ν™”λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μΌμ‹œμ  μ‚¬κ°μ§€λŒ€μ— λΉ μ Έμ„œ μ°Έμ‘°ν•  수 μ—†λ‹€.**

##### πŸ“ 2.2 `this` 바인딩

μ „μ—­ ν™˜κ²½ λ ˆμ½”λ“œμ˜ `[[GlobalThisValue]]` λ‚΄λΆ€ μŠ¬λ‘―μ— `this`κ°€ λ°”μΈλ”©λœλ‹€.
참고둜 μ „μ—­ ν™˜κ²½ λ ˆμ½”λ“œμ˜ ꡬ성 μš”μ†ŒμΈ 객체 ν™˜κ²½ λ ˆμ½”λ“œμ™€ 선언적 ν™˜κ²½ λ ˆμ½”λ“œμ—λŠ” `this` 바인딩이 μ—†λ‹€.
`this` 바인딩은 μ „μ—­ ν™˜κ²½ λ ˆμ½”λ“œμ™€ ν•¨μˆ˜ ν™˜κ²½ λ ˆμ½”λ“œμ—λ§Œ μ‘΄μž¬ν•œλ‹€.

##### πŸ“ 2.3 μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘° κ²°μ •

μ΄λŠ” μƒμœ„ μŠ€μ½”ν”„λ₯Ό 가리킀며, 이λ₯Ό 톡해 단방ν–₯ λ§ν¬λ“œ 리슀트인 μŠ€μ½”ν”„ 체인을 κ΅¬ν˜„ν•œλ‹€.
μœ„ 예제의 κ²½μš°μ—λŠ” μ „μ—­ μ½”λ“œλ₯Ό ν¬ν•¨ν•˜λŠ” μ†ŒμŠ€μ½”λ“œλŠ” μ—†μœΌλ―€λ‘œ μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ 참쑰에 `null`이 ν• λ‹Ήλœλ‹€.

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

이제 μ „μ—­ μ½”λ“œκ°€ 순차적으둜 μ‹€ν–‰λ˜λ©°, λ³€μˆ˜ 살당문이 μ‹€ν–‰λ˜μ–΄ μ „μ—­ λ³€μˆ˜ `x`, `y`에 값이 ν• λ‹Ήλ˜κ³  `foo` ν•¨μˆ˜κ°€ ν˜ΈμΆœλœλ‹€.
λ³€μˆ˜ ν• λ‹Ήλ¬Έ λ˜λŠ” ν•¨μˆ˜ ν˜ΈμΆœλ¬Έμ„ μ‹€ν–‰ν•˜λ €λ©΄ λ¨Όμ € λ³€μˆ˜/ν•¨μˆ˜ 이름이 μ„ μ–Έλœ μ‹λ³„μžμΈμ§€ ν™•μΈν•˜λŠ” 과정이 ν•„μš”ν•˜λ‹€.
**μ‹λ³„μž 결정을 μœ„ν•΄ μ‹λ³„μžλ₯Ό 검색할 λ•ŒλŠ” μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ μ‹λ³„μžλ₯Ό κ²€μƒ‰ν•˜κΈ° μ‹œμž‘ν•˜λ©°, μ—†λ‹€λ©΄ μƒμœ„ μŠ€μ½”ν”„λ‘œ 이동해 κ²€μƒ‰ν•œλ‹€.**

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

ν•¨μˆ˜ μ½”λ“œ ν‰κ°€λŠ” μ•„λž˜ μˆœμ„œλ‘œ μ§„ν–‰λœλ‹€.

1. ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ 생성
2. ν•¨μˆ˜ λ ‰μ‹œμ»¬ ν™˜κ²½ 생성
1. ν•¨μˆ˜ ν™˜κ²½ λ ˆμ½”λ“œ 생성
2. `this` 바인딩
3. μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘° κ²°μ •

##### πŸ“ 1. ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ 생성

`foo` ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό 생성해 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ˜ μ΅œμƒμœ„μ— ν‘Έμ‹œν•œλ‹€.

##### πŸ“ 2. ν•¨μˆ˜ λ ‰μ‹œμ»¬ ν™˜κ²½ 생성

##### πŸ“ 2.1. ν•¨μˆ˜ ν™˜κ²½ λ ˆμ½”λ“œ 생성

λ§€κ°œλ³€μˆ˜, `arguments` 객체, ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ„ μ–Έν•œ 지역 λ³€μˆ˜μ™€ 쀑첩 ν•¨μˆ˜λ₯Ό λ“±λ‘ν•˜κ³  κ΄€λ¦¬ν•œλ‹€.

##### πŸ“ 2.2. `this` 바인딩

ν•¨μˆ˜ 호좜 방식에 따라 κ²°μ •λ˜λ©°, `foo` ν•¨μˆ˜λŠ” 일반 ν•¨μˆ˜λ‘œ ν˜ΈμΆœλ˜μ—ˆμœΌλ―€λ‘œ `this`λŠ” μ „μ—­ 객체λ₯Ό 가리킨닀.

##### πŸ“ 2.3. μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘° κ²°μ •

μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ 참쑰에 `foo` ν•¨μˆ˜ μ •μ˜κ°€ ν‰κ°€λœ μ‹œμ μ— μ‹€ν–‰ μ€‘μ΄μ—ˆλ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ μ°Έμ‘°κ°€ κ²°μ •λœλ‹€.
이 κ²½μš°μ—λŠ” μ „μ—­ μ½”λ“œ 평가 μ‹œμ μ— ν‰κ°€λ˜λ―€λ‘œ μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ μ°Έμ‘°κ°€ ν• λ‹Ήλœλ‹€.
13.5μ ˆμ—μ„œ **μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ ν˜ΈμΆœν–ˆλŠ”μ§€κ°€ μ•„λ‹ˆλΌ 어디에 μ •μ˜ν–ˆλŠ”μ§€μ— 따라 μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•œλ‹€κ³  ν–ˆμ—ˆλ‹€**!

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

λŸ°νƒ€μž„μ΄ μ‹œμž‘λ˜κ³ , λ§€κ°œλ³€μˆ˜μ— μΈμˆ˜κ°€ ν• λ‹Ήλ˜κ³  λ³€μˆ˜ 할당문이 μ‹€ν–‰λ˜μ–΄ 지역 λ³€μˆ˜ `x`, `y`에 값이 ν• λ‹Ήλœ ν›„ ν•¨μˆ˜ `bar`κ°€ ν˜ΈμΆœλœλ‹€.

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

μœ„μ— κΈ°μˆ ν•œ κ³Όμ •κ³Ό λ™μΌν•˜λ‹€.

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

λŸ°νƒ€μž„μ΄ μ‹œμž‘λ˜μ–΄ λ§€κ°œλ³€μˆ˜μ— μΈμˆ˜κ°€ ν• λ‹Ήλ˜κ³  λ³€μˆ˜ 할당문이 μ‹€ν–‰λ˜μ–΄ 지역 λ³€μˆ˜ `z`에 값이 ν• λ‹Ήλœλ‹€.
`bar` ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ λ¨Όμ € `console` μ‹λ³„μžλ₯Ό κ²μƒ‰ν•˜κ³ , μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½μœΌλ‘œ 거슬러 μ˜¬λΌκ°€ `console`을 μ°ΎλŠ”λ‹€.
κ·Έ λ‹€μŒ `console`에 λ°”μΈλ”©λœ κ°μ²΄μ—μ„œ `log` λ©”μ„œλ“œλ₯Ό κ²€μƒ‰ν•œ ν›„, ν‘œν˜„μ‹ `a + b + x + y + z`λ₯Ό ν‰κ°€ν•œλ‹€.
평가가 μ™„λ£Œλ˜λ©΄ μƒμ„±ν•œ 값을 `console.log` λ©”μ„œλ“œμ— μ „λ‹¬ν•˜μ—¬ ν˜ΈμΆœν•œλ‹€.

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

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ—μ„œ `bar` ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ νŒλ˜μ–΄ μ œκ±°λœλ‹€.

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

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

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ—λŠ” 아무것도 λ‚¨μ•„μžˆμ§€ μ•Šκ²Œ λœλ‹€.

0 comments on commit faa1297

Please sign in to comment.