Skip to content

Commit

Permalink
docs: 24.1 ~ 24.3 정리 (#1001)
Browse files Browse the repository at this point in the history
  • Loading branch information
wuzoo authored Dec 12, 2023
1 parent 70a2dbe commit 5a16483
Showing 1 changed file with 197 additions and 0 deletions.
197 changes: 197 additions & 0 deletions docs/24_ν΄λ‘œμ €/졜주용.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
# πŸ“Œ 24μž₯ ν΄λ‘œμ €

**TIL 기둝일** : 2023.12.12 (24.1 ~ 24.3)

## λͺ©μ°¨

[1. μ„œλ‘ ](#-μ„œλ‘ )
[2. λ ‰μ‹œμ»¬ μŠ€μ½”ν”„](#-241-λ ‰μ‹œμ»¬-μŠ€μ½”ν”„)
[3. ν•¨μˆ˜ 객체의 λ‚΄λΆ€ 슬둯 [[Environment]]](#-242-ν•¨μˆ˜-객체의-λ‚΄λΆ€-슬둯-environment)
[4. ν΄λ‘œμ €μ™€ λ ‰μ‹œμ»¬ ν™˜κ²½](#-243-ν΄λ‘œμ €μ™€-λ ‰μ‹œμ»¬-ν™˜κ²½)

## πŸ‘‰ μ„œλ‘ 

ν΄λ‘œμ €<sup>closure</sup> λŠ” λ‚œν•΄ν•˜κΈ°λ‘œ 유λͺ…ν•œ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κ°œλ… 쀑 ν•˜λ‚˜λ‘œ ν•œλ²ˆμ―€ λ“€μ–΄λ³΄μ•˜μ„ 것이닀. 사싀 ν΄λ‘œμ €λŠ” μ•žμ„œ μ‚΄νŽ΄λ³Έ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μ΄ν•΄ν•˜κ³  μžˆλ‹€λ©΄ 그리 μ–΄λ €μš΄ κ°œλ…μ€ μ•„λ‹ˆλ‹€.

ν΄λ‘œμ €λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 고유의 κ°œλ…μ΄ μ•„λ‹Œ, ν•¨μˆ˜λ₯Ό 일급 객체둜 μ·¨κΈ‰ν•˜λŠ” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ μ‚¬μš©λ˜λŠ” μ€‘μš”ν•œ νŠΉμ„±μ΄λ‹€.

MDNμ—μ„œλŠ” ν΄λ‘œμ €μ— λŒ€ν•΄ λ‹€μŒκ³Ό 같이 μ„€λͺ…ν•œλ‹€.

> ν΄λ‘œμ €λŠ” ν•¨μˆ˜μ™€ κ·Έ ν•¨μˆ˜κ°€ μ„ μ–Έλœ λ ‰μ‹œμ»¬ ν™˜κ²½κ³Όμ˜ 쑰합이닀.
"ν•¨μˆ˜κ°€ μ„ μ–Έλœ λ ‰μ‹œμ»¬ ν™˜κ²½"μ΄λž€ λ¬΄μ—‡μΌκΉŒ

```javascript
const x = 1;

function outerFunc() {
const x = 10;
function innerFunc() {
console.log(x); // 10;
}

innerFunc();
}

outerFunc();
```

λ‹€μŒκ³Ό 같이 μž‘μ„±ν•œλ‹€λ©΄ `innerFunc` ν•¨μˆ˜λ₯Ό `outerFunc` ν•¨μˆ˜μ˜ λ‚΄λΆ€μ—μ„œ ν˜ΈμΆœν•œλ‹€ ν•˜λ”λΌλ„ outerFunc ν•¨μˆ˜μ˜ λ³€μˆ˜μ— μ ‘κ·Όν•  수 μ—†λ‹€.

```javascript
const x = 1;

function outerFunc() {
const x = 10;
innerFunc();
}

function innerFunc() {
console.log(x); // 1
}

outerFunc();
```

이 같은 ν˜„μƒμ΄ λ°œμƒν•˜λŠ” μ΄μœ λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ λ ‰μ‹œμ»¬ μŠ€μ½”ν”„λ₯Ό λ”°λ₯΄λŠ” ν”„λ‘œκ·Έλž˜λ° 언어이기 λ•Œλ¬Έμ΄λ‹€.

## πŸ‘‰ 24.1 λ ‰μ‹œμ»¬ μŠ€μ½”ν”„

**μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ ν˜ΈμΆœν–ˆλŠ”μ§€κ°€ μ•„λ‹ˆλΌ ν•¨μˆ˜λ₯Ό 어디에 μ •μ˜ν–ˆλŠ”μ§€μ— 따라 μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•œλ‹€. 이λ₯Ό λ ‰μ‹œμ»¬ μŠ€μ½”ν”„(정적 μŠ€μ½”ν”„)라 ν•œλ‹€.**

23μž₯ "μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ"μ—μ„œ μ‚΄νŽ΄λ³΄μ•˜λ“―μ΄ μŠ€μ½”ν”„μ˜ μ‹€μ²΄λŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ΄λ‹€. 이 λ ‰μ‹œμ»¬ ν™˜κ²½μ€ μžμ‹ μ˜ "μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°"λ₯Ό 톡해 μƒμœ„ λ ‰μ‹œμ»¬ ν™˜κ²½κ³Ό μ—°κ²°λœλ‹€. 이것이 λ°”λ‘œ μŠ€μ½”ν”„ 체인이닀.

λ”°λΌμ„œ λ‹€μ‹œ ν•œλ²ˆ λ ‰μ‹œμ»¬ μŠ€μ½”ν”„μ˜ μ •μ˜λ₯Ό 해보면 λ‹€μŒκ³Ό κ°™λ‹€.

**λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ "μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°"에 μ €μž₯ν•  μ°Έμ‘°κ°’, 즉 μƒμœ„ μŠ€μ½”ν”„μ— λŒ€ν•œ μ°Έμ‘°λŠ” ν•¨μˆ˜ μ •μ˜κ°€ ν‰κ°€λ˜λŠ” μ‹œμ μ— ν•¨μˆ˜κ°€ μ •μ˜λœ ν™˜κ²½(μœ„μΉ˜)에 μ˜ν•΄ κ²°μ •λœλ‹€. 이것이 λ°”λ‘œ λ ‰μ‹œμ»¬ μŠ€μ½”ν”„λ‹€.**

## πŸ‘‰ 24.2 ν•¨μˆ˜ 객체의 λ‚΄λΆ€ 슬둯 [[Environment]]

ν•¨μˆ˜λŠ” μƒμœ„μŠ€μ½”ν”„λ₯Ό κΈ°μ–΅ν•˜κΈ° μœ„ν•΄ **μžμ‹ μ˜ λ‚΄λΆ€ 슬둯 [[Environment]]에 μžμ‹ μ΄ μ •μ˜λœ ν™˜κ²½, 즉 μƒμœ„ μŠ€μ½”ν”„μ˜ μ°Έμ‘°λ₯Ό μ €μž₯ν•œλ‹€.**

λ‹€μ‹œ 말해, ν•¨μˆ˜ μ •μ˜κ°€ ν‰κ°€λ˜μ–΄ ν•¨μˆ˜ 객체λ₯Ό 생성할 λ•Œ μžμ‹ μ΄ μ •μ˜λœ ν™˜κ²½(μœ„μΉ˜)에 μ˜ν•΄ κ²°μ •λœ μƒμœ„ μŠ€μ½”ν”„μ˜ μ°Έμ‘°λ₯Ό ν•¨μˆ˜ 객체 μžμ‹ μ˜ λ‚΄λΆ€ 슬둯 [[Environment]]에 μ €μž₯ν•œλ‹€. μ΄λ•Œ [[Environment]]에 μ €μž₯된 μƒμœ„ μŠ€μ½”ν”„μ˜ μ°Έμ‘°λŠ” **ν˜„μž¬ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ**의 λ ‰μ‹œμ»¬ ν™˜κ²½μ„ 가리킨닀.

μ™œλƒν•˜λ©΄ ν•¨μˆ˜ μ •μ˜κ°€ ν‰κ°€λ˜μ–΄ ν•¨μˆ˜ 객체λ₯Ό μƒμ„±ν•˜λŠ” μ‹œμ μ€ ν•¨μˆ˜κ°€ μ •μ˜λœ ν™˜κ²½, 즉 μƒμœ„ν•¨μˆ˜κ°€ 평가 λ˜λŠ” μ‹€ν–‰λ˜κ³  μžˆλŠ” μ‹œμ μ΄λ©°, μ΄λ•Œ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μƒμœ„ ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ΄κΈ° λ•Œλ¬Έμ΄λ‹€.

**λ”°λΌμ„œ ν•¨μˆ˜ 객체의 λ‚΄λΆ€ 슬둯 [[Environment]]에 μ €μž₯된 ν˜„μž¬ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ μ°Έμ‘°κ°€ λ°”λ‘œ μƒμœ„ μŠ€μ½”ν”„λ‹€. λ˜ν•œ μžμ‹ μ΄ ν˜ΈμΆœλ˜μ—ˆμ„ λ•Œ 생성될 ν•¨μˆ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ "μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°"에 μ €μž₯될 참쑰값이닀.**

ν•¨μˆ˜ κ°μ²΄λŠ” μžμ‹ μ΄ μ‘΄μž¬ν•˜λŠ” ν•œ, [[Envrionment]]에 μ €μž₯ν•œ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ μ°Έμ‘°, μƒμœ„ μŠ€μ½”ν”„λ₯Ό κΈ°μ–΅ν•œλ‹€.

```javascript
const x = 1;

function foo() {
const x = 10;

// μƒμœ„ μŠ€μ½”ν”„λŠ” ν•¨μˆ˜ μ •μ˜ ν™˜κ²½μ— 따라 κ²°μ •λœλ‹€.
// ν•¨μˆ˜ 호좜 μœ„μΉ˜μ™€ μƒμœ„ μŠ€μ½”ν”„λŠ” μ•„λ¬΄λŸ° 관계 x
bar();
}

// ν•¨μˆ˜ barλŠ” μžμ‹ μ˜ μƒμœ„ μŠ€μ½”ν”„, 즉 μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ [[Environment]]에 μ €μž₯ν•˜μ—¬ κΈ°μ–΅ν•œλ‹€.
function bar() {
console.log(x);
}
```

foo, bar ν•¨μˆ˜ λͺ¨λ‘ μ „μ—­μ—μ„œ ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜λ˜μ—ˆλ‹€. λ”°λΌμ„œ μ „μ—­ μ½”λ“œκ°€ ν‰κ°€λ˜λŠ” μ‹œμ μ— ν‰κ°€λ˜μ–΄ ν•¨μˆ˜ 객체λ₯Ό μƒμ„±ν•˜κ³  μ „μ—­ 객체 `window`의 λ©”μ„œλ“œκ°€ λœλ‹€. μ΄λ•Œ [[Environment]] λ‚΄λΆ€ μŠ¬λ‘―μ—λŠ”, ν•¨μˆ˜ μ •μ˜κ°€ ν‰κ°€λœ μ‹œμ μ—μ„œμ˜ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μΈ μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ μ°Έμ‘°κ°€ μ €μž₯λœλ‹€.

## πŸ‘‰ 24.3 ν΄λ‘œμ €μ™€ λ ‰μ‹œμ»¬ ν™˜κ²½

λ‹€μŒ 예제λ₯Ό 보자.

```javascript
const x = 1;

// 1)
function outer() {
const x = 10;
const inner = function () {
// 2)
console.log(x);
};
return inner;
}

// outer ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ 쀑첩 ν•¨μˆ˜ innerλ₯Ό λ°˜ν™˜ν•œλ‹€.
// 그리고 outer ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ—μ„œ νŒλ˜μ–΄ μ œκ±°λœλ‹€.
const innerFunc = outer(); // 3)
innerFunc(); // 4)
```

outer ν•¨μˆ˜ (`3)`)을 ν˜ΈμΆœν•˜λ©΄ outer ν•¨μˆ˜λŠ” 쀑첩 ν•¨μˆ˜ innerλ₯Ό λ°˜ν™˜ν•˜κ³  생λͺ… μ£ΌκΈ°λ₯Ό λ§ˆκ°ν•œλ‹€. 즉, outer ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μ œκ±°λ˜μ—ˆμœΌλ―€λ‘œ outer ν•¨μˆ˜μ˜ 지역 λ³€μˆ˜ x λ˜ν•œ 생λͺ…μ£ΌκΈ°λ₯Ό λ§ˆκ°ν•œλ‹€.

κ·ΈλŸ¬λ‚˜ μœ„ μ½”λ“œμ˜ μ‹€ν–‰ κ²°κ³Ό(`4)`)λŠ” outer ν•¨μˆ˜μ˜ 지역 λ³€μˆ˜ x의 값인 10이닀. 이미 생λͺ… μ£ΌκΈ°κ°€ μ’…λ£Œλ˜μ–΄ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ—μ„œ 제거된 outer ν•¨μˆ˜μ˜ 지역 λ³€μˆ˜ xκ°€ λΆ€ν™œμ΄λΌλ„ ν•œ λ“― λ™μž‘ν•˜κ³  μžˆλ‹€.

이처럼 **μ™ΈλΆ€ ν•¨μˆ˜λ³΄λ‹€ 쀑첩 ν•¨μˆ˜(λ‚΄λΆ€ ν•¨μˆ˜)κ°€ 더 였래 μœ μ§€λ˜λŠ” 경우 쀑첩 ν•¨μˆ˜λŠ” 이미 생λͺ… μ£ΌκΈ°κ°€ μ’…λ£Œν•œ μ™ΈλΆ€ ν•¨μˆ˜μ˜ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€. μ΄λŸ¬ν•œ 쀑첩 ν•¨μˆ˜λ₯Ό ν΄λ‘œμ €λΌκ³  λΆ€λ₯Έλ‹€.**

---

> ν΄λ‘œμ €λŠ” ν•¨μˆ˜μ™€ κ·Έ ν•¨μˆ˜κ°€ μ„ μ–Έλœ λ ‰μ‹œμ»¬ ν™˜κ²½κ³Όμ˜ 쑰합이닀.
"κ·Έ ν•¨μˆ˜κ°€ μ„ μ–Έλœ λ ‰μ‹œμ»¬ ν™˜κ²½"μ΄λž€ ν•¨μˆ˜κ°€ μ •μ˜λœ μœ„μΉ˜μ˜ μŠ€μ½”ν”„, 즉 μƒμœ„ μŠ€μ½”ν”„λ₯Ό μ˜λ―Έν•˜λŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ λ§ν•œλ‹€.

μœ„ 예제둜 λŒμ•„κ°€ 보자.

1. **μ „μ—­ ν•¨μˆ˜ 객체의 μƒμœ„ μŠ€μ½”ν”„ κ²°μ •**
outer ν•¨μˆ˜κ°€ ν‰κ°€λ˜μ–΄ ν•¨μˆ˜ 객체λ₯Ό 생성(`1)`)ν•  λ•Œ ν˜„μž¬ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½, 즉 μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ outer ν•¨μˆ˜ 객체의 [[Environment]] λ‚΄λΆ€ μŠ¬λ‘―μ— μ €μž₯ν•œλ‹€.
outer ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ outer ν•¨μˆ˜μ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ΄ μƒμ„±λ˜κ³ , [[Environment]] λ‚΄λΆ€ μŠ¬λ‘―μ— μ €μž₯된 μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ outer ν•¨μˆ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ "μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°"에 ν• λ‹Ήν•œλ‹€.

2. **쀑첩 ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„ κ²°μ •**
inner 쀑첩 ν•¨μˆ˜κ°€ ν‰κ°€λœλ‹€.(`2)` ν•¨μˆ˜ ν‘œν˜„μ‹μœΌλ‘œ μ •μ˜ν–ˆκΈ° λ•Œλ¬Έμ— λŸ°νƒ€μž„μ— 평가) 이 λ•Œ 쀑첩 ν•¨μˆ˜ innerλŠ” μžμ‹ μ˜ [[Environment]] λ‚΄λΆ€ μŠ¬λ‘―μ— ν˜„μž¬ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½, outer ν•¨μˆ˜μ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ μƒμœ„ μŠ€μ½”ν”„λ‘œμ„œ μ €μž₯ν•œλ‹€.

3. **outer ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ 제거, but λ ‰μ‹œμ»¬ ν™˜κ²½μ€ μœ μ§€**
outer ν•¨μˆ˜μ˜ 싀행이 μ’…λ£Œν•˜λ©΄ inner ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λ©΄μ„œ outer ν•¨μˆ˜μ˜ 생λͺ… μ£ΌκΈ°κ°€ μ’…λ£Œλœλ‹€.(`3)`) 즉, μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ—μ„œ μ œκ±°λœλ‹€.
μ΄λ•Œ **outer ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ—μ„œ μ œκ±°λ˜μ§€λ§Œ outer ν•¨μˆ˜μ˜ λ ‰μ‹œμ»¬ ν™˜κ²½κΉŒμ§€ μ†Œλ©Έν•˜λŠ” 것은 μ•„λ‹ˆλ‹€.**

outer ν•¨μˆ˜μ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ€ inner ν•¨μˆ˜μ˜ [[Environment]] λ‚΄λΆ€ μŠ¬λ‘―μ— μ˜ν•΄ μ°Έμ‘°, inner ν•¨μˆ˜λŠ” μ „μ—­ λ³€μˆ˜ `innerFunc`에 μ˜ν•΄ 참쑰되고 μžˆμœΌλ―€λ‘œ κ°€λΉ„μ§€μ»¬λ ‰μ…˜μ˜ λŒ€μƒμ΄ λ˜μ§€ μ•ŠλŠ”λ‹€.

4. **inner ν•¨μˆ˜ 호좜**
inner ν•¨μˆ˜λ₯Ό 호좜(`4)`)ν•˜λ©΄ inner ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λ˜κ³  μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ— ν‘Έμ‹œλœλ‹€. 그리고 λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°λŠ” inner ν•¨μˆ˜ 객체의 [[Environment]] λ‚΄λΆ€ μŠ¬λ‘―μ— μ €μž₯λ˜μ–΄ μžˆλŠ” 참쑰값이 ν• λ‹Ήλœλ‹€.
쀑첩 ν•¨μˆ˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜μ˜ 생쑴 여뢀와 상관없이 μžμ‹ μ΄ μ •μ˜λœ μœ„μΉ˜μ— μ˜ν•΄ κ²°μ •λœ μƒμœ„ μŠ€μ½”ν”„λ₯Ό κΈ°μ–΅ν•œλ‹€. 이처럼 쀑첩 ν•¨μˆ˜ inner의 λ‚΄λΆ€μ—μ„œλŠ” μƒμœ„ μŠ€μ½”ν”„λ₯Ό μ°Έμ‘°ν•  수 μžˆμœΌλ―€λ‘œ μƒμœ„ μŠ€μ½”ν”„μ˜ μ‹λ³„μžλ₯Ό μ°Έμ‘°ν•  수 있고 μ‹λ³„μžμ˜ 값을 λ³€κ²½ν•  μˆ˜λ„ μžˆλ‹€.

![](https://velog.velcdn.com/images/wuzoo/post/9e9f69c1-f7f7-465d-86e6-ed88af384642/image.png)

---

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“  ν•¨μˆ˜λŠ” μƒμœ„ μŠ€μ½”ν”„λ₯Ό κΈ°μ–΅ν•˜λ―€λ‘œ 이둠적으둜 λͺ¨λ“  ν•¨μˆ˜λŠ” ν΄λ‘œμ €λ‹€. ν•˜μ§€λ§Œ 일반적으둜 λͺ¨λ“  ν•¨μˆ˜λ₯Ό ν΄λ‘œμ €λΌκ³  ν•˜μ§€λŠ” μ•ŠλŠ”λ‹€.

1. μƒμœ„ μŠ€μ½”ν”„μ˜ μ–΄λ–€ μ‹λ³„μžλ„ μ°Έμ‘°ν•˜μ§€ μ•ŠλŠ” ν•¨μˆ˜λŠ” ν΄λ‘œμ €κ°€ μ•„λ‹ˆλ‹€.
예λ₯Ό λ“€μ–΄ 쀑첩 ν•¨μˆ˜ `bar`κ°€ μ™ΈλΆ€ ν•¨μˆ˜ `foo`보닀 더 였래 μœ μ§€λœλ‹€ ν•˜λ”λΌλ„, μƒμœ„ μŠ€μ½”ν”„μ˜ μ–΄λ–€ μ‹λ³„μžλ„ μ°Έμ‘°ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ ν΄λ‘œμ €κ°€ μ•„λ‹ˆλ‹€. μ°Έμ‘°ν•˜μ§€λ„ μ•ŠλŠ” μ‹λ³„μžλ₯Ό κΈ°μ–΅ν•˜λŠ” 것은 λ©”λͺ¨λ¦¬ 낭비이기 λ•Œλ¬Έμ΄λ‹€.

2. μ™ΈλΆ€ ν•¨μˆ˜λ³΄λ‹€ 일찍 μ†Œλ©Έν•˜λŠ” ν•¨μˆ˜λŠ” ν΄λ‘œμ €κ°€ μ•„λ‹ˆλ‹€.
μƒμœ„ μŠ€μ½”ν”„μ˜ μ‹λ³„μžλ₯Ό μ°Έμ‘°ν•œλ‹€ ν•˜λ”λΌλ„, μ™ΈλΆ€ ν•¨μˆ˜ `foo`λ‘œλΆ€ν„° 쀑첩 ν•¨μˆ˜ `bar`κ°€ λ°˜ν™˜λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” λ“±μ˜ 이유둜 쀑첩 ν•¨μˆ˜κ°€ 생λͺ… μ£ΌκΈ°κ°€ 더 짧은 κ²½μš°κ°€ μžˆλ‹€. μ΄λŸ¬ν•œ 쀑첩 ν•¨μˆ˜λŠ” ν΄λ‘œμ €μ˜€μ§€λ§Œ μ™ΈλΆ€ ν•¨μˆ˜λ³΄λ‹€ 일찍 μ†Œλ©Έν•˜κΈ° λ•Œλ¬Έμ— μ½œλ‘œμ €μ˜ λ³Έμ§ˆμ— λΆ€ν•©ν•˜μ§€ μ•ŠλŠ”λ‹€. λ”°λΌμ„œ ν΄λ‘œμ €λΌκ³  ν•˜μ§€ μ•ŠλŠ”λ‹€.

λ‹€μŒκ³Ό 같은 예제λ₯Ό 보자.

```html
<!DOCTYPE html>
<html>
<body>
<script>
function foo() {
const x = 1;
const y = 2;
function bar() {
debugger;
console.log(x);
}
return bar;
}
const bar = foo();
bar();
</script>
</body>
</html>
```

쀑첩 ν•¨μˆ˜ barλŠ” μƒμœ„ μŠ€μ½”ν”„μ˜ μ‹λ³„μž(`x`)λ₯Ό μ°Έμ‘°ν•˜κ³  μžˆμœΌλ―€λ‘œ ν΄λ‘œμ €λ‹€. 그리고 μ™ΈλΆ€ ν•¨μˆ˜μ˜ μ™ΈλΆ€λ‘œ λ°˜ν™˜λ˜μ–΄ μ™ΈλΆ€ ν•¨μˆ˜λ³΄λ‹€ 더 였래 μ‚΄μ•„λ‚¨λŠ”λ‹€.

μ΄λŸ¬ν•œ 쀑첩 ν•¨μˆ˜λ₯Ό ν΄λ‘œμ €λΌκ³  λΆ€λ₯Έλ‹€. **ν΄λ‘œμ €λŠ” 쀑첩 ν•¨μˆ˜κ°€ μƒμœ„ μŠ€μ½”ν”„μ˜ μ‹λ³„μžλ₯Ό μ°Έμ‘°ν•˜κ³  있고 쀑첩 ν•¨μˆ˜κ°€ μ™ΈλΆ€ ν•¨μˆ˜λ³΄λ‹€ 더 였래 μœ μ§€λ˜λŠ” κ²½μš°μ— ν•œμ •ν•˜λŠ” 것이 μΌλ°˜μ μ΄λ‹€.**

λ‹€λ§Œ ν΄λ‘œμ €μΈ 쀑첩 ν•¨μˆ˜ barλŠ” μƒμœ„ μŠ€μ½”ν”„μ˜ x, y μ‹λ³„μž 쀑 x만 μ°Έμ‘°ν•˜κ³  μžˆλ‹€. 이런 경우 λŒ€λΆ€λΆ„μ˜ λͺ¨λ˜ λΈŒλΌμš°μ €λŠ” μ΅œμ ν™”λ₯Ό 톡해 μ‹λ³„μž 쀑 ν΄λ‘œμ €κ°€ μ°Έμ‘°ν•˜κ³  μžˆλŠ” μ‹λ³„μžλ§Œμ„ κΈ°μ–΅ν•œλ‹€.

ν΄λ‘œμ €μ— μ˜ν•΄ μ°Έμ‘°λ˜λŠ” μƒμœ„ μŠ€μ½”ν”„μ˜ λ³€μˆ˜λ₯Ό **자유 λ³€μˆ˜<sup>free variable</sup>** 라고 λΆ€λ₯Έλ‹€.
ν΄λ‘œμ €λž€ "ν•¨μˆ˜κ°€ 자유 λ³€μˆ˜μ— λŒ€ν•΄ λ‹«ν˜€μžˆλ‹€.<sup>closed</sup>"λΌλŠ” μ˜λ―Έλ‹€. 즉, "자유 λ³€μˆ˜μ— λ¬Άμ—¬μžˆλŠ” ν•¨μˆ˜"이닀.

0 comments on commit 5a16483

Please sign in to comment.