Skip to content

Latest commit

ย 

History

History
200 lines (146 loc) ยท 11.1 KB

File metadata and controls

200 lines (146 loc) ยท 11.1 KB

ํด๋กœ์ €๋Š” ์ค‘์š”ํ•œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ๋น„๋‹จ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฟ๋งŒ ์•„๋‹Œ, ํ•จ์ˆ˜๋ฅผ ์ผ๊ธ‰ ๊ฐ์ฒด๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ํด๋กœ์ €๋Š” ๋‹จ์ ์œผ๋กœ ๋งํ•˜์ž๋ฉด, ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋์„ ๋•Œ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ(Lexical environment)์ž…๋‹ˆ๋‹ค.

๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ํ•จ์ˆ˜๋ฅผ ์–ด๋””์— ์ •์˜ํ–ˆ๋Š”์ง€์— ๋”ฐ๋ผ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๊ฒฐ์ •ํ•˜๋ฉฐ, ์ด๋ฅผ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„(์ •์  ์Šค์ฝ”ํ”„)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ ์Šค์ฝ”ํ”„์—์„œ ๋‹ค๋ฃฌ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณผ๊นŒ์š”?

const x = 1;

function outer(){
  const x = 10;
  inner();
}

function inner(){
  console.log(x);
}

outer();    // 1
inner();  // 2

outer์™€ inner ํ•จ์ˆ˜์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋Š” ์ „์—ญ์ž…๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋ฅผ ์–ด๋””์—์„œ ํ˜ธ์ถœํ–ˆ๋Š”์ง€๋Š” ํ•จ์ˆ˜์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„์— ์–ด๋–ค ์˜ํ–ฅ๋„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ •์ ์œผ๋กœ ๊ฒฐ์ •๋˜๊ณ  ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด์ฃ . ์Šค์ฝ”ํ”„์˜ ์‹ค์ฒด๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์ด๋ฉฐ, ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์€ ์ž์‹ ์˜ ์™ธ๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ์ƒ์œ„ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ๊ณผ ์—ฐ๊ฒฐ๋˜๋Š” ์ด๊ฒƒ์ด ์Šค์ฝ”ํ”„ ์ฒด์ธ(Scope Chainner) ์ž…๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„๋Š” ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์˜ ์™ธ๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ฐธ์กฐ์— ์ €์žฅํ•  ์ฐธ์กฐ ๊ฐ’(์ƒ์œ„ ์Šค์ฝ”ํ”„์— ๋Œ€ํ•œ ์ฐธ์กฐ)์€ ํ•จ์ˆ˜๊ฐ€ ํ‰๊ฐ€๋˜๋Š” ์‹œ์ ์— ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋œ ํ™˜๊ฒฝ(์œ„์น˜)์— ์˜ํ•ด ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ์Šฌ๋กฏ [[Environment]]

ํ•จ์ˆ˜๋Š” ์ž์‹ ์˜ ๋‚ด๋ถ€ ์Šฌ๋กฏ [[Environment]]์— ์ž์‹ ์ด ์ •์˜๋œ ํ™˜๊ฒฝ์ธ ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋œ ํ™˜๊ฒฝ(์œ„์น˜)๊ณผ ํ˜ธ์ถœ๋˜๋Š” ํ™˜๊ฒฝ(์œ„์น˜)๋Š” ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„๋Š” ์ž์‹ ์ด ์ •์˜๋œ ํ™˜๊ฒฝ์—์„œ์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๊ธฐ์–ตํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด ๋•Œ ์ž์‹ ์˜ ๋‚ด๋ถ€ ์Šฌ๋กฏ์ธ [[Environment]]์— ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜์ฐธ์กฐ๋ฅผ ์ €์žฅํ•˜๊ณ , ์ด๋Š” ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ ์ด์œ ๋Š” ํ•จ์ˆ˜ ์ •์˜๊ฐ€ ํ‰๊ฐ€๋˜์–ด ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์‹œ์ ์€ ์ƒ์œ„ ํ•จ์ˆ˜(๋˜๋Š” ์ „์—ญ ์ฝ”๋“œ)๊ฐ€ ํ‰๊ฐ€๋˜๊ณ  ์‹คํ–‰๋˜๋Š” ์‹œ์ ์ด๊ณ , ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ์ƒ์œ„ ํ•จ์ˆ˜(๋˜๋Š” ์ „์—ญ ์ฝ”๋“œ)์ด๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ๊ฒฐ๊ตญ ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ์Šฌ๋กฏ [[Environment]]์— ์ €์žฅ๋œ ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์˜ ์ฐธ์กฐ๊ฐ€ ๋ฐ”๋กœ ์ƒ์œ„ ์Šค์ฝ”ํ”„๊ฐ€ ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ํ•จ์ˆ˜ ๋‚ด๋ถ€๋กœ ์ฝ”๋“œ์˜ ์ œ์–ด๊ถŒ(Control)์ด ์ด๋™ํ•˜๊ณ , ํ•จ์ˆ˜๋ฅผ ์•„๋ž˜์˜ ์ˆœ์„œ๋Œ€๋กœ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  1. ํ•จ์ˆ˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์ƒ์„ฑ
  2. ํ•จ์ˆ˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ ์ƒ์„ฑ
    1. ํ•จ์ˆ˜ ํ™˜๊ฒฝ ๋ ˆ์ฝ”๋“œ ์ƒ์„ฑ
    2. this ๋ฐ”์ธ๋”ฉ
    3. ์™ธ๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•จ ์ฐธ์กฐ ๊ฒฐ์ •

์™ธ๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ฐธ์กฐ์—๋Š” ํ•จ์ˆ˜ ๊ฐ์ฒด ๋‚ด๋ถ€ ์Šฌ๋กฏ [[Environment]]์— ์ €์žฅ๋œ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์˜ ์ฐธ์กฐ๊ฐ€ ํ• ๋‹น๋˜๊ณ , ์ด๋Š” ํ•จ์ˆ˜์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ํ•จ์ˆ˜ ์ •์˜ ์œ„์น˜์— ๋”ฐ๋ผ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„์ž…๋‹ˆ๋‹ค. ์ž, ์—ฌ๊ธฐ๊นŒ์ง€ ๊ณ ์ƒํ•˜์…จ์–ด์š”. ์ด์ œ ํด๋กœ์ €๋ฅผ ์•Œ์•„๋ด…์‹œ๋‹ค.


ํด๋กœ์ €์™€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ

์™ธ๋ถ€ ํ•จ์ˆ˜๋ณด๋‹ค ๋” ์˜ค๋ž˜ ์œ ์ง€๋˜์–ด ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ฅผ ํด๋กœ์ €(Closure)๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

์ฝ”๋“œ์˜ ํ๋ฆ„๋Œ€๋กœ ์ดํ•ดํ•ด๋ณด์ฃ . ํšจ๊ณผ์ ์ธ ์ดํ•ด๋ฅผ ์œ„ํ•ด ํ•จ์ˆ˜ ํ‘œํ˜„์‹์œผ๋กœ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

const x = 1;

function outer(){
  const x = 10;
  return function() {
    console.log(x);
  };
}

const exec = outer(); // ํ•จ์ˆ˜ ํ˜ธ์ถœ
exec();               // 10
  1. const exec = outer();๋กœ outer ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ต๋ช…ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  outer ํ•จ์ˆ˜๋Š” ์ข…๋ฃŒ๋˜์–ด ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์Šคํƒ์—์„œ ์ œ๊ฑฐ(pop)๋ฉ๋‹ˆ๋‹ค.
  2. outer ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ง€์—ญ ๋ณ€์ˆ˜ const x = 10;์€ ๋‹น์—ฐํžˆ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
  3. ์œ ํšจํ•˜์ง€ ์•Š๊ฒŒ ๋œ ์ง€์—ญ ๋ณ€์ˆ˜ x์˜ ๊ฐ’์ด๋ฏ€๋กœ, ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” 1์ด ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ €ํฌ๋Š” ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” outer ํ•จ์ˆ˜์˜ ์ง€์—ญ ๋ณ€์ˆ˜ x์˜ ๊ฐ’์ธ 10์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ๋‚ด๋ถ€ ํ•จ์ˆ˜๊ฐ€ ์™ธ๋ถ€ํ•จ์ˆ˜๋ณด๋‹ค ์˜ค๋ž˜ ์œ ์ง€๋˜๋Š” ๊ฒฝ์šฐ, ๋‚ด๋ถ€ ํ•จ์ˆ˜๋Š” ์ข…๋ฃŒ๋œ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๊ณ  ์ด๋ฅผ ํด๋กœ์ €๋ผ ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

outer ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ๋‚ด๋ถ€ ํ•จ์ˆ˜๊ฐ€ ํ‰๊ฐ€๋˜๋ฉด ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์ •์˜๋œ ์ต๋ช… ํ•จ์ˆ˜๋Š” ์ž์‹ ์˜ ๋‚ด๋ถ€ ์Šฌ๋กฏ [[Environment]]์— ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์ธ outer ํ•จ์ˆ˜์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

outer ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋œ์–ด ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์Šคํƒ์ด ์ œ๊ฑฐ๋œ๋‹ค๊ณ  outer ํ•จ์ˆ˜์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ๊นŒ์ง€ ์†Œ๋ฉธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ์—์š”. ์ด๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์ „์—, ํ˜„์žฌ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ํ‘œ์‹œํ•˜๊ณ -์“ธ๊ธฐ(Mark-and-sweep) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ Garbage Collection์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ์•Œ์•„๋‘์‹œ๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

์ •๋ฆฌํ•˜์ž๋ฉด, outer ํ•จ์ˆ˜์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์€ ํ˜„์žฌ ๋ฐ˜ํ™˜๋œ ์ต๋ช… ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€ ์Šฌ๋กฏ [[Environment]]์ด ์ฐธ์กฐํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ „์—ญ ๋ณ€์ˆ˜ exec์— ํ• ๋‹นํ–ˆ์œผ๋ฏ€๋กœ Garbage Collection์˜ ๋Œ€์ƒ์ด ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Garbage Collector๋Š” ์ฐธ์กฐ๋˜๊ณ  ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋งˆ์Œ๋Œ€๋กœ ์ œ๊ฑฐํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด์ฃ !

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจ๋“  ํ•จ์ˆ˜๋Š” ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๊ธฐ์–ตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ก ์ ์œผ๋กœ๋Š” ๋ชจ๋‘ ํด๋กœ์ €์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ๋ชจ๋“  ํ•จ์ˆ˜๋ฅผ ํด๋กœ์ €๋ผ๊ณ  ํ•˜์ง„ ์•Š์ฃ . ๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ๋ณผ๊นŒ์š”?

const x = 1;

function outer(){
  const y = 10;       // * ์ด ๋ถ€๋ถ„๋งŒ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
  return function() {
    console.log(x);
  };
}

const exec = outer(); // ํ•จ์ˆ˜ ํ˜ธ์ถœ
exec();               // 1

์˜ˆ์ œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์ „์— ์ƒ๊ฐํ•ด์•ผ ํ•  ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๊ธฐ์–ตํ•˜๋ ค๋ฉด ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฉ”๋ชจ๋ฆฌ ์„ฑ๋Šฅ์ด ๋งค์šฐ ์ €ํ•˜๋˜๊ฒ ์ฃ ? ์ž, ์œ„์˜ ์˜ˆ์ œ์—์„œ๋„ ๋ฐ˜ํ™˜๋œ ์ต๋ช… ํ•จ์ˆ˜๋Š” ์™ธ๋ถ€ ํ•จ์ˆ˜๋ณด๋‹ค ์˜ค๋ž˜ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ y ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ฐ˜ํ™˜๋œ ์ต๋ช… ํ•จ์ˆ˜์˜ ์ฐธ์กฐ๋Š” ๊ณง๋ฐ”๋กœ ์†Œ๋ฉธํ•ฉ๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ๋Œ€๋ถ€๋ถ„์˜ ๋ชจ๋˜ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ตœ์ ํ™”๋ฅผ ํ†ตํ•ด ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ์–ด๋–ค ์‹๋ณ„์ž๋„ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๊ธฐ์–ตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์ตœ์ ํ™”๊ฐ€ ๋งค์šฐ ์ž˜ ๋˜์–ด ์žˆ์–ด์š”. ํด๋กœ์ €๊ฐ€ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์ง€ ์•Š์€ ์‹๋ณ„์ž๋Š” ๊ธฐ์–ตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ์–ตํ•ด์•ผ ํ•  ์‹๋ณ„์ž๋งŒ์„ ๊ธฐ์–ตํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋ผ๊ณ  ํ•  ์ˆ˜ ์—†์ฃ .

์—ฌ๋‹ด์œผ๋กœ ํด๋กœ์ €์— ์˜ํ•ด ์ฐธ์กฐ๋˜๋Š” ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜๋ฅผ ์ž์œ  ๋ณ€์ˆ˜(Free Variable)๋ผ ๋ถ€๋ฅด๋ฉฐ ํด๋กœ์ €๋ฅผ ์ž์œ  ๋ณ€์ˆ˜์— ๋ฌถ์—ฌ์žˆ๋Š” ํ•จ์ˆ˜๋ผ๊ณ  ์˜์—ญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


ํด๋กœ์ €์˜ ํ™œ์šฉ

์ƒํƒœ(State)๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์€๋‹‰ํ•˜๊ณ  ํŠน์ • ํ•จ์ˆ˜์—๊ฒŒ๋งŒ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์บก์Аํ™”(Encapsulation)๋Š” ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ”„๋กœํผํ‹ฐ์™€ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์กฐ์ž‘ํ•˜๋Š” ๋™์ž‘์ธ ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งˆ์น˜ ์บก์А์ฒ˜๋Ÿผ ์“ฐ๊ธฐ ํŽธํ•ด์ง€์ฃ . ์—ฌ๊ธฐ์—๋Š” ํŠน์ • ํ”„๋กœํผํ‹ฐ, ๋ฉ”์„œ๋“œ๋ฅผ ์ˆจ๊ธธ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•˜๋ฉฐ ์ด๋ฅผ ์ •๋ณด ์€๋‹‰(Information Hiding)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ •๋ณด๋ฅผ ์ˆจ๊ธด๋‹ค๋Š” ๊ฒƒ์€ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€๋ฅผ ๊ณต๊ฐœํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์™ธ๋ถ€์˜ ์˜ณ์ง€ ๋ชปํ•œ ์ ‘๊ทผ์œผ๋กœ๋ถ€ํ„ฐ ๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ •๋ณด๋ฅผ ๋ณดํ˜ธํ•˜๊ณ  ๊ฐ์ฒด ๊ฐ„ ์ƒํ˜ธ ์˜์กด์„ฑ(๊ฒฐํ•ฉ๋„, Coupling)์„ ๋‚ฎ์ถ”๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ์ฃ .

๊ทธ๋Ÿฌ๋‚˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ •๋ณด ์€๋‹‰์„ ์™„์ „ํ•˜๊ฒŒ ์ง€์›ํ•˜์ง€ ์•Š์•„์„œ... ์•„๋ž˜์™€ ๊ฐ™์ด ํ‰๋‚ด๋งŒ ๋‚ผ ์ˆ˜ ์žˆ์ฃ . ์ด๋Ÿด ๋•Œ ํด๋กœ์ €๊ฐ€ ๋งค์šฐ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

// ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›๊ณ  ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ณ ์ฐจ ํ•จ์ˆ˜
// ์ž์œ  ๋ณ€์ˆ˜ counter๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ํด๋กœ์ €๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
function makeCounter(predicate) {
  // ์นด์šดํŠธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ์ž์œ  ๋ณ€์ˆ˜
  let counter = 0;

  // ํด๋กœ์ € ๋ฐ˜ํ™˜
  return function () {
    // ์ธ์ˆ˜๋กœ ์ „๋‹ฌ ๋ฐ›์€ ๋ณด์กฐ ํ•จ์ˆ˜์— ์ƒํƒœ ๋ณ€๊ฒฝ ์œ„์ž„
    counter = predicate(counter);
    return counter;
  };
}

// ๋ณด์กฐ ํ•จ์ˆ˜
function increase(n) {
  return ++n;
}

// ๋ณด์กฐ ํ•จ์ˆ˜
function decrease(n) {
  return --n;
}

// ํ•จ์ˆ˜๋กœ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
// makeCounter ํ•จ์ˆ˜๋Š” ๋ณด์กฐ ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์•„ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
const increaser = makeCounter(increase);
console.log(increaser()); // 1
console.log(increaser()); // 2

// increaser ํ•จ์ˆ˜์™€๋Š” ๋…๋ฆฝ๋œ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์ด๋ฏ€๋กœ ๋‚ด๋ถ€ ์ƒํƒœ๊ฐ€ ์—ฐ๋™๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
const decreaser = makeCounter(decrease);
console.log(decreaser()); // -1
console.log(decreaser()); // -2

makeCounter ํ•จ์ˆ˜๋Š” ๊ณ ์ฐจ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์ž์‹ ์ด ์ƒ์„ฑ๋œ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์ธ makeCounter ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„์˜ counter ๋ณ€์ˆ˜๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ํด๋กœ์ €์ฃ . ์ฝ”๋“œ๋กœ ๋ณด๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ์ด์–ด์ง€์ง€ ์•Š์ฃ ? ์ด๋Š” makeCounter ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ˜ํ™˜๋œ ํ•จ์ˆ˜๋Š” ์ž์‹ ๋งŒ์˜ ๋…๋ฆฝ๋œ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ๊ฐ–๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด makCounter ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์ด ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด์ฃ .

์ด์ฒ˜๋Ÿผ ํด๋กœ์ €๋Š” ์ƒํƒœ(State)๊ฐ€ ์˜๋„์น˜ ์•Š๊ฒŒ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋„๋ก ์•ˆ์ „ํ•˜๊ฒŒ ์ •๋ณด๋ฅผ ์€๋‹‰ํ•˜๊ณ  ํŠน์ • ํ•จ์ˆ˜์—๊ฒŒ๋งŒ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์œ„์˜ ์˜ˆ์ œ์—์„œ ์ƒํƒœ๋ฅผ ๊ณต์œ (Share) ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•ด๋ด…๋‹ˆ๋‹ค.

// ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ณ ์ฐจ ํ•จ์ˆ˜
// ์ž์œ  ๋ณ€์ˆ˜ counter๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ํด๋กœ์ €๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
const counter = (function () {
  // ์นด์šดํŠธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ž์œ  ๋ณ€์ˆ˜
  let counter = 0;

  // ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›๋Š” ํด๋กœ์ € ๋ฐ˜ํ™˜
  return function (predicate) {
    // ์ธ์ˆ˜๋กœ ์ „๋‹ฌ ๋ฐ›์€ ๋ณด์กฐ ํ•จ์ˆ˜์— ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์œ„์ž„ํ•ฉ๋‹ˆ๋‹ค.
    counter = predicate(counter);
    return counter;
  };
}());

// ๋ณด์กฐ ํ•จ์ˆ˜
function increase(n) {
  return ++n;
}

// ๋ณด์กฐ ํ•จ์ˆ˜
function decrease(n) {
  return --n;
}

// ๋ณด์กฐ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
console.log(counter(increase)); // 1
console.log(counter(increase)); // 2

// ์ž์œ  ๋ณ€์ˆ˜๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.
console.log(counter(decrease)); // 1
console.log(counter(decrease)); // 0

๋…๋ฆฝ๋œ ์นด์šดํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ ์—ฐ๋™ํ•˜์—ฌ ์ฆ๊ฐ์ด ๊ฐ€๋Šฅํ•œ ์นด์šดํ„ฐ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ๊ณต์œ ํ•˜๋Š” ํด๋กœ์ €๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.




2021-10-04, ์ถ”๊ฐ€์ ์œผ๋กœ ๊ณต๋ถ€์™€ ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๋‚ด์šฉ๋“ค

๐Ÿง ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•  ์ 

์˜๋ฌธ์ 

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ(Lexical Environment)๋Š” ์„ ์–ธ๋œ ์‹œ์ ์—์„œ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–๋Š”๋ฐ, this๋Š”... ๋‹ค๋ฅธ๊ฐ€์š”? ์•„๋ž˜ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ๋ณด์ฃ !

์ •๋ฆฌ ๋œ ๋‚ด์šฉ

  • ์ •๋ฆฌํ•ด์•ผํ•จ

  • ์ฐธ์กฐ Link