Skip to content

Commit ea32f4e

Browse files
authored
Merge pull request #45 from InSeong-So/main
โœ๏ธ 6ํšŒ์ฐจ ๋ฌธ์„œ ์ถ”๊ฐ€ : ํด๋กœ์ €
2 parents 2c4fc5d + a083c5a commit ea32f4e

File tree

2 files changed

+204
-4
lines changed

2 files changed

+204
-4
lines changed

โ€ŽJavascript/closure.mdโ€Ž

Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
ํด๋กœ์ €๋Š” ์ค‘์š”ํ•œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ๋น„๋‹จ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฟ๋งŒ ์•„๋‹Œ, ํ•จ์ˆ˜๋ฅผ ์ผ๊ธ‰ ๊ฐ์ฒด๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ํด๋กœ์ €๋Š” ๋‹จ์ ์œผ๋กœ ๋งํ•˜์ž๋ฉด, `ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋์„ ๋•Œ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ(Lexical environment)`์ž…๋‹ˆ๋‹ค.
2+
3+
## ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„
4+
> ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ํ•จ์ˆ˜๋ฅผ ์–ด๋””์— ์ •์˜ํ–ˆ๋Š”์ง€์— ๋”ฐ๋ผ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๊ฒฐ์ •ํ•˜๋ฉฐ, ์ด๋ฅผ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„(์ •์  ์Šค์ฝ”ํ”„)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
5+
6+
์ด๋ฏธ [์Šค์ฝ”ํ”„](https://github.com/FECrash/JavascriptCrash/blob/mainner/Javascript/scope.md)์—์„œ ๋‹ค๋ฃฌ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณผ๊นŒ์š”?
7+
8+
```js
9+
const x = 1;
10+
11+
function outer(){
12+
const x = 10;
13+
inner();
14+
}
15+
16+
function inner(){
17+
console.log(x);
18+
}
19+
20+
outer(); // 1
21+
inner(); // 2
22+
```
23+
24+
outer์™€ inner ํ•จ์ˆ˜์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋Š” ์ „์—ญ์ž…๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋ฅผ ์–ด๋””์—์„œ ํ˜ธ์ถœํ–ˆ๋Š”์ง€๋Š” ํ•จ์ˆ˜์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„์— ์–ด๋–ค ์˜ํ–ฅ๋„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ •์ ์œผ๋กœ ๊ฒฐ์ •๋˜๊ณ  ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด์ฃ . ์Šค์ฝ”ํ”„์˜ ์‹ค์ฒด๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์ด๋ฉฐ, ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์€ ์ž์‹ ์˜ `์™ธ๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ฐธ์กฐ`๋ฅผ ํ†ตํ•ด ์ƒ์œ„ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ๊ณผ ์—ฐ๊ฒฐ๋˜๋Š” ์ด๊ฒƒ์ด **์Šค์ฝ”ํ”„ ์ฒด์ธ(Scope Chainner)** ์ž…๋‹ˆ๋‹ค.
25+
26+
๊ฒฐ๊ตญ **๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„๋Š” ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์˜ ์™ธ๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ฐธ์กฐ์— ์ €์žฅํ•  ์ฐธ์กฐ ๊ฐ’(์ƒ์œ„ ์Šค์ฝ”ํ”„์— ๋Œ€ํ•œ ์ฐธ์กฐ)์€ ํ•จ์ˆ˜๊ฐ€ ํ‰๊ฐ€๋˜๋Š” ์‹œ์ ์— ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋œ ํ™˜๊ฒฝ(์œ„์น˜)์— ์˜ํ•ด ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ**์ž…๋‹ˆ๋‹ค.
27+
28+
<br>
29+
30+
## ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ์Šฌ๋กฏ `[[Environment]]`
31+
> ํ•จ์ˆ˜๋Š” ์ž์‹ ์˜ ๋‚ด๋ถ€ ์Šฌ๋กฏ `[[Environment]]`์— ์ž์‹ ์ด ์ •์˜๋œ ํ™˜๊ฒฝ์ธ ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
32+
33+
ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋œ ํ™˜๊ฒฝ(์œ„์น˜)๊ณผ ํ˜ธ์ถœ๋˜๋Š” ํ™˜๊ฒฝ(์œ„์น˜)๋Š” ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„๋Š” ์ž์‹ ์ด ์ •์˜๋œ ํ™˜๊ฒฝ์—์„œ์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๊ธฐ์–ตํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด ๋•Œ ์ž์‹ ์˜ ๋‚ด๋ถ€ ์Šฌ๋กฏ์ธ `[[Environment]]`์— ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜์ฐธ์กฐ๋ฅผ ์ €์žฅํ•˜๊ณ , ์ด๋Š” ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
34+
35+
๊ทธ ์ด์œ ๋Š” ํ•จ์ˆ˜ ์ •์˜๊ฐ€ ํ‰๊ฐ€๋˜์–ด ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์‹œ์ ์€ ์ƒ์œ„ ํ•จ์ˆ˜(๋˜๋Š” ์ „์—ญ ์ฝ”๋“œ)๊ฐ€ ํ‰๊ฐ€๋˜๊ณ  ์‹คํ–‰๋˜๋Š” ์‹œ์ ์ด๊ณ , ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ์ƒ์œ„ ํ•จ์ˆ˜(๋˜๋Š” ์ „์—ญ ์ฝ”๋“œ)์ด๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ๊ฒฐ๊ตญ ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ์Šฌ๋กฏ `[[Environment]]`์— ์ €์žฅ๋œ ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์˜ ์ฐธ์กฐ๊ฐ€ ๋ฐ”๋กœ ์ƒ์œ„ ์Šค์ฝ”ํ”„๊ฐ€ ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
36+
37+
ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ํ•จ์ˆ˜ ๋‚ด๋ถ€๋กœ ์ฝ”๋“œ์˜ ์ œ์–ด๊ถŒ(Control)์ด ์ด๋™ํ•˜๊ณ , ํ•จ์ˆ˜๋ฅผ ์•„๋ž˜์˜ ์ˆœ์„œ๋Œ€๋กœ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
38+
1. ํ•จ์ˆ˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์ƒ์„ฑ
39+
2. ํ•จ์ˆ˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ ์ƒ์„ฑ
40+
1. ํ•จ์ˆ˜ ํ™˜๊ฒฝ ๋ ˆ์ฝ”๋“œ ์ƒ์„ฑ
41+
2. this ๋ฐ”์ธ๋”ฉ
42+
3. `์™ธ๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•จ ์ฐธ์กฐ ๊ฒฐ์ •`
43+
44+
์™ธ๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ฐธ์กฐ์—๋Š” ํ•จ์ˆ˜ ๊ฐ์ฒด ๋‚ด๋ถ€ ์Šฌ๋กฏ `[[Environment]]`์— ์ €์žฅ๋œ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์˜ ์ฐธ์กฐ๊ฐ€ ํ• ๋‹น๋˜๊ณ , ์ด๋Š” ํ•จ์ˆ˜์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ํ•จ์ˆ˜ ์ •์˜ ์œ„์น˜์— ๋”ฐ๋ผ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„์ž…๋‹ˆ๋‹ค. ์ž, ์—ฌ๊ธฐ๊นŒ์ง€ ๊ณ ์ƒํ•˜์…จ์–ด์š”. ์ด์ œ ํด๋กœ์ €๋ฅผ ์•Œ์•„๋ด…์‹œ๋‹ค.
45+
46+
<br>
47+
48+
## ํด๋กœ์ €์™€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ
49+
> ์™ธ๋ถ€ ํ•จ์ˆ˜๋ณด๋‹ค ๋” ์˜ค๋ž˜ ์œ ์ง€๋˜์–ด ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ฅผ ํด๋กœ์ €(Closure)๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
50+
51+
์ฝ”๋“œ์˜ ํ๋ฆ„๋Œ€๋กœ ์ดํ•ดํ•ด๋ณด์ฃ . ํšจ๊ณผ์ ์ธ ์ดํ•ด๋ฅผ ์œ„ํ•ด ํ•จ์ˆ˜ ํ‘œํ˜„์‹์œผ๋กœ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
52+
```js
53+
const x = 1;
54+
55+
function outer(){
56+
const x = 10;
57+
return function() {
58+
console.log(x);
59+
};
60+
}
61+
62+
const exec = outer(); // ํ•จ์ˆ˜ ํ˜ธ์ถœ
63+
exec(); // 10
64+
```
65+
66+
1. `const exec = outer();`๋กœ outer ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ต๋ช…ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  outer ํ•จ์ˆ˜๋Š” ์ข…๋ฃŒ๋˜์–ด ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์Šคํƒ์—์„œ ์ œ๊ฑฐ(pop)๋ฉ๋‹ˆ๋‹ค.
67+
2. outer ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ง€์—ญ ๋ณ€์ˆ˜ `const x = 10;`์€ ๋‹น์—ฐํžˆ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
68+
3. ์œ ํšจํ•˜์ง€ ์•Š๊ฒŒ ๋œ ์ง€์—ญ ๋ณ€์ˆ˜ x์˜ ๊ฐ’์ด๋ฏ€๋กœ, ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” 1์ด ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ €ํฌ๋Š” **์ƒ๊ฐ**ํ•ฉ๋‹ˆ๋‹ค.
69+
70+
๊ทธ๋Ÿฌ๋‚˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” outer ํ•จ์ˆ˜์˜ ์ง€์—ญ ๋ณ€์ˆ˜ x์˜ ๊ฐ’์ธ `10`์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ **๋‚ด๋ถ€ ํ•จ์ˆ˜๊ฐ€ ์™ธ๋ถ€ํ•จ์ˆ˜๋ณด๋‹ค ์˜ค๋ž˜ ์œ ์ง€๋˜๋Š” ๊ฒฝ์šฐ, ๋‚ด๋ถ€ ํ•จ์ˆ˜๋Š” ์ข…๋ฃŒ๋œ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๊ณ  ์ด๋ฅผ ํด๋กœ์ €๋ผ ๋ถ€๋ฆ…๋‹ˆ๋‹ค**.
71+
72+
outer ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ๋‚ด๋ถ€ ํ•จ์ˆ˜๊ฐ€ ํ‰๊ฐ€๋˜๋ฉด ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์ •์˜๋œ ์ต๋ช… ํ•จ์ˆ˜๋Š” ์ž์‹ ์˜ ๋‚ด๋ถ€ ์Šฌ๋กฏ `[[Environment]]`์— ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์ธ outer ํ•จ์ˆ˜์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
73+
74+
outer ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋œ์–ด ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์Šคํƒ์ด ์ œ๊ฑฐ๋œ๋‹ค๊ณ  outer ํ•จ์ˆ˜์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ๊นŒ์ง€ ์†Œ๋ฉธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ์—์š”. ์ด๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์ „์—, ํ˜„์žฌ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ [ํ‘œ์‹œํ•˜๊ณ -์“ธ๊ธฐ(Mark-and-sweep) ์•Œ๊ณ ๋ฆฌ์ฆ˜](https://developer.mozilla.org/ko/docs/Web/JavaScript/Memory_Management#mark-and-sweep_algorithm)์„ ์‚ฌ์šฉํ•œ Garbage Collection์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ์•Œ์•„๋‘์‹œ๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.
75+
76+
์ •๋ฆฌํ•˜์ž๋ฉด, outer ํ•จ์ˆ˜์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์€ ํ˜„์žฌ ๋ฐ˜ํ™˜๋œ ์ต๋ช… ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€ ์Šฌ๋กฏ `[[Environment]]`์ด ์ฐธ์กฐํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ „์—ญ ๋ณ€์ˆ˜ exec์— ํ• ๋‹นํ–ˆ์œผ๋ฏ€๋กœ Garbage Collection์˜ ๋Œ€์ƒ์ด ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Garbage Collector๋Š” ์ฐธ์กฐ๋˜๊ณ  ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋งˆ์Œ๋Œ€๋กœ ์ œ๊ฑฐํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด์ฃ !
77+
78+
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจ๋“  ํ•จ์ˆ˜๋Š” ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๊ธฐ์–ตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ก ์ ์œผ๋กœ๋Š” ๋ชจ๋‘ ํด๋กœ์ €์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ๋ชจ๋“  ํ•จ์ˆ˜๋ฅผ ํด๋กœ์ €๋ผ๊ณ  ํ•˜์ง„ ์•Š์ฃ . ๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ๋ณผ๊นŒ์š”?
79+
```js
80+
const x = 1;
81+
82+
function outer(){
83+
const y = 10; // * ์ด ๋ถ€๋ถ„๋งŒ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
84+
return function() {
85+
console.log(x);
86+
};
87+
}
88+
89+
const exec = outer(); // ํ•จ์ˆ˜ ํ˜ธ์ถœ
90+
exec(); // 1
91+
```
92+
93+
์˜ˆ์ œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์ „์— ์ƒ๊ฐํ•ด์•ผ ํ•  ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๊ธฐ์–ตํ•˜๋ ค๋ฉด ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฉ”๋ชจ๋ฆฌ ์„ฑ๋Šฅ์ด ๋งค์šฐ ์ €ํ•˜๋˜๊ฒ ์ฃ ? ์ž, ์œ„์˜ ์˜ˆ์ œ์—์„œ๋„ ๋ฐ˜ํ™˜๋œ ์ต๋ช… ํ•จ์ˆ˜๋Š” ์™ธ๋ถ€ ํ•จ์ˆ˜๋ณด๋‹ค ์˜ค๋ž˜ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ y ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ฐ˜ํ™˜๋œ ์ต๋ช… ํ•จ์ˆ˜์˜ ์ฐธ์กฐ๋Š” ๊ณง๋ฐ”๋กœ ์†Œ๋ฉธํ•ฉ๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ๋Œ€๋ถ€๋ถ„์˜ ๋ชจ๋˜ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ตœ์ ํ™”๋ฅผ ํ†ตํ•ด ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ์–ด๋–ค ์‹๋ณ„์ž๋„ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๊ธฐ์–ตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์ตœ์ ํ™”๊ฐ€ ๋งค์šฐ ์ž˜ ๋˜์–ด ์žˆ์–ด์š”. ํด๋กœ์ €๊ฐ€ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์ง€ ์•Š์€ ์‹๋ณ„์ž๋Š” ๊ธฐ์–ตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ์–ตํ•ด์•ผ ํ•  ์‹๋ณ„์ž๋งŒ์„ ๊ธฐ์–ตํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋ผ๊ณ  ํ•  ์ˆ˜ ์—†์ฃ .
94+
95+
์—ฌ๋‹ด์œผ๋กœ ํด๋กœ์ €์— ์˜ํ•ด ์ฐธ์กฐ๋˜๋Š” ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜๋ฅผ `์ž์œ  ๋ณ€์ˆ˜(Free Variable)`๋ผ ๋ถ€๋ฅด๋ฉฐ ํด๋กœ์ €๋ฅผ `์ž์œ  ๋ณ€์ˆ˜์— ๋ฌถ์—ฌ์žˆ๋Š” ํ•จ์ˆ˜`๋ผ๊ณ  ์˜์—ญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
96+
97+
<br>
98+
99+
## ํด๋กœ์ €์˜ ํ™œ์šฉ
100+
> ์ƒํƒœ(State)๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์€๋‹‰ํ•˜๊ณ  ํŠน์ • ํ•จ์ˆ˜์—๊ฒŒ๋งŒ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
101+
102+
์บก์Аํ™”(Encapsulation)๋Š” ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ”„๋กœํผํ‹ฐ์™€ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์กฐ์ž‘ํ•˜๋Š” ๋™์ž‘์ธ ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งˆ์น˜ ์บก์А์ฒ˜๋Ÿผ ์“ฐ๊ธฐ ํŽธํ•ด์ง€์ฃ . ์—ฌ๊ธฐ์—๋Š” ํŠน์ • ํ”„๋กœํผํ‹ฐ, ๋ฉ”์„œ๋“œ๋ฅผ ์ˆจ๊ธธ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•˜๋ฉฐ ์ด๋ฅผ ์ •๋ณด ์€๋‹‰(Information Hiding)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ •๋ณด๋ฅผ ์ˆจ๊ธด๋‹ค๋Š” ๊ฒƒ์€ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€๋ฅผ ๊ณต๊ฐœํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์™ธ๋ถ€์˜ ์˜ณ์ง€ ๋ชปํ•œ ์ ‘๊ทผ์œผ๋กœ๋ถ€ํ„ฐ ๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ •๋ณด๋ฅผ ๋ณดํ˜ธํ•˜๊ณ  ๊ฐ์ฒด ๊ฐ„ ์ƒํ˜ธ ์˜์กด์„ฑ(๊ฒฐํ•ฉ๋„, Coupling)์„ ๋‚ฎ์ถ”๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ์ฃ .
103+
104+
๊ทธ๋Ÿฌ๋‚˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ •๋ณด ์€๋‹‰์„ ์™„์ „ํ•˜๊ฒŒ ์ง€์›ํ•˜์ง€ ์•Š์•„์„œ... ์•„๋ž˜์™€ ๊ฐ™์ด ํ‰๋‚ด๋งŒ ๋‚ผ ์ˆ˜ ์žˆ์ฃ . ์ด๋Ÿด ๋•Œ ํด๋กœ์ €๊ฐ€ ๋งค์šฐ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
105+
106+
```js
107+
// ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›๊ณ  ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ณ ์ฐจ ํ•จ์ˆ˜
108+
// ์ž์œ  ๋ณ€์ˆ˜ counter๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ํด๋กœ์ €๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
109+
function makeCounter(predicate) {
110+
// ์นด์šดํŠธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ์ž์œ  ๋ณ€์ˆ˜
111+
let counter = 0;
112+
113+
// ํด๋กœ์ € ๋ฐ˜ํ™˜
114+
return function () {
115+
// ์ธ์ˆ˜๋กœ ์ „๋‹ฌ ๋ฐ›์€ ๋ณด์กฐ ํ•จ์ˆ˜์— ์ƒํƒœ ๋ณ€๊ฒฝ ์œ„์ž„
116+
counter = predicate(counter);
117+
return counter;
118+
};
119+
}
120+
121+
// ๋ณด์กฐ ํ•จ์ˆ˜
122+
function increase(n) {
123+
return ++n;
124+
}
125+
126+
// ๋ณด์กฐ ํ•จ์ˆ˜
127+
function decrease(n) {
128+
return --n;
129+
}
130+
131+
// ํ•จ์ˆ˜๋กœ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
132+
// makeCounter ํ•จ์ˆ˜๋Š” ๋ณด์กฐ ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์•„ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
133+
const increaser = makeCounter(increase);
134+
console.log(increaser()); // 1
135+
console.log(increaser()); // 2
136+
137+
// increaser ํ•จ์ˆ˜์™€๋Š” ๋…๋ฆฝ๋œ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์ด๋ฏ€๋กœ ๋‚ด๋ถ€ ์ƒํƒœ๊ฐ€ ์—ฐ๋™๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
138+
const decreaser = makeCounter(decrease);
139+
console.log(decreaser()); // -1
140+
console.log(decreaser()); // -2
141+
```
142+
143+
makeCounter ํ•จ์ˆ˜๋Š” ๊ณ ์ฐจ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์ž์‹ ์ด ์ƒ์„ฑ๋œ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์ธ makeCounter ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„์˜ counter ๋ณ€์ˆ˜๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ํด๋กœ์ €์ฃ . ์ฝ”๋“œ๋กœ ๋ณด๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ์ด์–ด์ง€์ง€ ์•Š์ฃ ? ์ด๋Š” makeCounter ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ˜ํ™˜๋œ ํ•จ์ˆ˜๋Š” **์ž์‹ ๋งŒ์˜ ๋…๋ฆฝ๋œ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ**์„ ๊ฐ–๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด makCounter ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์ด ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด์ฃ .
144+
145+
์ด์ฒ˜๋Ÿผ ํด๋กœ์ €๋Š” ์ƒํƒœ(State)๊ฐ€ ์˜๋„์น˜ ์•Š๊ฒŒ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋„๋ก ์•ˆ์ „ํ•˜๊ฒŒ ์ •๋ณด๋ฅผ ์€๋‹‰ํ•˜๊ณ  ํŠน์ • ํ•จ์ˆ˜์—๊ฒŒ๋งŒ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
146+
147+
๋งŒ์•ฝ ์œ„์˜ ์˜ˆ์ œ์—์„œ ์ƒํƒœ๋ฅผ **๊ณต์œ (Share)** ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•ด๋ด…๋‹ˆ๋‹ค.
148+
```js
149+
// ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ณ ์ฐจ ํ•จ์ˆ˜
150+
// ์ž์œ  ๋ณ€์ˆ˜ counter๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ํด๋กœ์ €๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
151+
const counter = (function () {
152+
// ์นด์šดํŠธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ž์œ  ๋ณ€์ˆ˜
153+
let counter = 0;
154+
155+
// ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›๋Š” ํด๋กœ์ € ๋ฐ˜ํ™˜
156+
return function (predicate) {
157+
// ์ธ์ˆ˜๋กœ ์ „๋‹ฌ ๋ฐ›์€ ๋ณด์กฐ ํ•จ์ˆ˜์— ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์œ„์ž„ํ•ฉ๋‹ˆ๋‹ค.
158+
counter = predicate(counter);
159+
return counter;
160+
};
161+
}());
162+
163+
// ๋ณด์กฐ ํ•จ์ˆ˜
164+
function increase(n) {
165+
return ++n;
166+
}
167+
168+
// ๋ณด์กฐ ํ•จ์ˆ˜
169+
function decrease(n) {
170+
return --n;
171+
}
172+
173+
// ๋ณด์กฐ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
174+
console.log(counter(increase)); // 1
175+
console.log(counter(increase)); // 2
176+
177+
// ์ž์œ  ๋ณ€์ˆ˜๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.
178+
console.log(counter(decrease)); // 1
179+
console.log(counter(decrease)); // 0
180+
```
181+
182+
๋…๋ฆฝ๋œ ์นด์šดํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ ์—ฐ๋™ํ•˜์—ฌ ์ฆ๊ฐ์ด ๊ฐ€๋Šฅํ•œ ์นด์šดํ„ฐ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ **๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ๊ณต์œ ํ•˜๋Š” ํด๋กœ์ €๋ฅผ ๋งŒ๋“ค์–ด์•ผ** ํ•ฉ๋‹ˆ๋‹ค.
183+
184+
<br>
185+
<hr>
186+
<br>
187+
188+
> 2021-10-04, ์ถ”๊ฐ€์ ์œผ๋กœ ๊ณต๋ถ€์™€ ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๋‚ด์šฉ๋“ค
189+
190+
## ๐Ÿง ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•  ์ 
191+
### ์˜๋ฌธ์ 
192+
- ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ(Lexical Environment)๋Š” **์„ ์–ธ๋œ ์‹œ์ **์—์„œ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–๋Š”๋ฐ, `this`๋Š”... ๋‹ค๋ฅธ๊ฐ€์š”? ์•„๋ž˜ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ๋ณด์ฃ !
193+
194+
### ์ •๋ฆฌ ๋œ ๋‚ด์šฉ
195+
- *์ •๋ฆฌํ•ด์•ผํ•จ*
196+
197+
- ์ฐธ์กฐ [Link](https://www.hanumoka.net/2017/08/31/javascript-20170831-javascript-closure-3/)
198+
199+
<hr>
200+
<br>

โ€ŽJavascript/prototype.mdโ€Ž

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -564,7 +564,7 @@ constructor ํ”„๋กœํผํ‹ฐ๋Š” prototype ํ”„๋กœํผํ‹ฐ๋กœ ์ž์‹ ์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ
564564
565565
> 2021-09-24, ์ •๋ฆฌ ์ค‘ ์‹๋ณ„๋œ ๋‚ด์šฉ์œผ๋กœ ์™œ ๋‹ค๋ฅธ์ง€ ์ดํ•ดํ•ด์•ผ ํ•  ๊ฒƒ
566566
567-
## โ˜‘๏ธ Google Chrome์˜ ๊ฐœ๋ฐœ์ž ์ฝ˜์†”์—์„œ `[[Prototype]]`์ด ์ถœ๋ ฅ
567+
## ๐Ÿง Google Chrome์˜ ๊ฐœ๋ฐœ์ž ์ฝ˜์†”์—์„œ `[[Prototype]]`์ด ์ถœ๋ ฅ
568568
### ์˜๋ฌธ์ 
569569
- ๋‚ด๋ถ€ ์Šฌ๋กฏ์— ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์„œ __proto__๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•œ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, ์‹ค์ œ ํฌ๋กœ๋‹ˆ์›€ ๋ธŒ๋ผ์šฐ์ €์˜ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ ๊ฐ์ฒด๋‚˜ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ์กฐํšŒํ•˜๋ฉด `[[Prototype]]`์ด ์ถœ๋ ฅ๋˜๋„ค์š”. ์–ธ์ œ ๋ฐ”๋€ ๊ฑธ๊นŒ์š”?
570570
@@ -576,7 +576,7 @@ constructor ํ”„๋กœํผํ‹ฐ๋Š” prototype ํ”„๋กœํผํ‹ฐ๋กœ ์ž์‹ ์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ
576576
577577
<br>
578578
579-
## โ˜‘๏ธ ์™œ __proto__๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ธˆ์ง€ํ• ๊นŒ์š”?
579+
## ๐Ÿง ์™œ __proto__๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ธˆ์ง€ํ• ๊นŒ์š”?
580580
### ์˜๋ฌธ์ 
581581
- __proto__๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ์ด์œ ๋Š” ๋ญ˜๊นŒ์š”?
582582
@@ -594,7 +594,7 @@ constructor ํ”„๋กœํผํ‹ฐ๋Š” prototype ํ”„๋กœํผํ‹ฐ๋กœ ์ž์‹ ์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ
594594
595595
<br>
596596
597-
## โ˜‘๏ธ ์™œ ์ผ๋ฐ˜ ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž…๊ณผ ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž…์ด ๊ตฌ๋ถ„๋ ๊นŒ์š”?
597+
## ๐Ÿง ์™œ ์ผ๋ฐ˜ ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž…๊ณผ ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž…์ด ๊ตฌ๋ถ„๋ ๊นŒ์š”?
598598
### ์˜๋ฌธ์ 
599599
- ๋ญ๊ฐ€ ๋‹ค๋ฅธ ๊ฑด์ง€ ์ดํ•ด๋Š” ํ–ˆ๋Š”๋ฐ... ์™œ ๋‹ค๋ฅธ ๊ฑธ๊นŒ์š”? ์„ค๋ช…์ด ํ•„์š”ํ•ด์š”.
600600
@@ -607,7 +607,7 @@ constructor ํ”„๋กœํผํ‹ฐ๋Š” prototype ํ”„๋กœํผํ‹ฐ๋กœ ์ž์‹ ์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ
607607
608608
<br>
609609
610-
โ˜‘๏ธ ์™œ ์ผ๋ฐ˜ ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž…๊ณผ ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž…์ด ๊ตฌ๋ถ„๋ ๊นŒ์š”?
610+
## ๐Ÿง ์™œ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์€ prototype์„ ๊ฐ€์ง€์ง€ ์•Š๋‚˜์š”?
611611
### ์˜๋ฌธ์ 
612612
- `constructor ํ”„๋กœํผํ‹ฐ๋Š” prototype ํ”„๋กœํผํ‹ฐ๋กœ ์ž์‹ ์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉฐ, ์ด๋Ÿฐ ์—ฐ๊ฒฐ์€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ์— ์ด๋ค„์ง‘๋‹ˆ๋‹ค`๋ผ๊ณ  ์ดํ•ดํ–ˆ๋Š”๋ฐ, ๊ทธ๋Ÿผ ์•„๋ž˜์˜ ๊ฒฝ์šฐ๋Š” ์–ด๋–ป๊ฒŒ ์„ค๋ช…ํ•ด์•ผ ํ• ๊นŒ์š”?
613613

0 commit comments

Comments
ย (0)