-
Notifications
You must be signed in to change notification settings - Fork 42
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
197 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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>"λΌλ μλ―Έλ€. μ¦, "μμ λ³μμ λ¬Άμ¬μλ ν¨μ"μ΄λ€. |