|
| 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> |
0 commit comments