์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ - ํด๋กœ์ €

2022. 4. 7. 23:51ใ†javascript

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ - ํด๋กœ์ €

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํด๋กœ์ €๋Š” "ํ•จ์ˆ˜์™€ ๊ทธ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋์„ ๋•Œ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ๊ณผ์˜ ์กฐํ•ฉ์ด๋‹ค."

 

MDN docs์˜ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด์„œ ์ € ๋ง์˜ ์˜๋ฏธ๋ฅผ ํƒ๊ตฌํ•ด๋ณด์ž.

 

 

makeFunc()ํ•จ์ˆ˜๋Š” ๋‚ด๋ถ€์˜ displayName()ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜์ด๊ณ  ์ด๋ฅผ myFunc๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ ๋ฆฌํ„ด์„ ๋ฐ›๊ฒŒ ๋œ๋‹ค. 

๊ฒฐ๊ตญ์€ myFunc๊ฐ€ displayNameํ•จ์ˆ˜๋ฅผ ๊ฐ–๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋•Œ myFunc๋ฅผ ์‹คํ–‰ํ•˜๋ฉด makeFunc๋‚ด๋ถ€์˜ ๋ณ€์ˆ˜ name์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. 

 

์ƒ์‹์ ์œผ๋กœ๋Š” ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋œ๋‹ค๋ฉด ๊ทธ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜์—๋Š” ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด ๋งž์„ํ…๋ฐ ์ด ๊ตฌ์กฐ์—์„œ๋Š” ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜์–ด๋„ ์–ด๋– ํ•œ ๋ณ€์ˆ˜์— ์˜ํ•ด์„œ ์ฐธ์กฐ๋˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ข…๋ฃŒ๋œ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜์—๋„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. 

 

์ฆ‰ "์™ธ๋ถ€ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜์–ด๋„ ์ฐธ์กฐ๋งŒ ๋œ๋‹ค๋ฉด ๊ทธ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๊ฐ’๋“ค์„ ๊ณ„์†ํ•ด์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ"์ด๋‹ค. ์ด๋ฅผ ํด๋กœ์ €๋ผ๊ณ  ํ•œ๋‹ค.  

 

๋‹ค์‹œ ํ•จ์ˆ˜์™€ ๊ทธ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋์„ ๋•Œ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ๊ณผ์˜ ์กฐํ•ฉ์ด๋ผ๋Š” ๋ฌธ์žฅ์„ ์‚ดํŽด๋ณด๋ฉด ํ•จ์ˆ˜๋Š” "๋‚ด๋ถ€ํ•จ์ˆ˜"๋ฅผ ์˜๋ฏธํ•˜๊ณ  "๋‚ด๋ถ€ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋์„ ๋•Œ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ"์€ ์œ„์˜ ์˜ˆ์‹œ์—์„œ name๊ณผ๊ฐ™์€ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ์˜๋ฏธํ•œ๋‹ค. 

 

ํ•˜๋‚˜ ์–ดํœ˜๋ฅผ ์งš๊ณ  ๊ฐ€๋ฉด ํด๋กœ์ €์— ์˜ํ•ด ์ฐธ์กฐ๋˜๋Š” ์™ธ๋ถ€ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜๋ฅผ ์ž์œ ๋ณ€์ˆ˜๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” name์ด ์ž์œ ๋ณ€์ˆ˜์ด๋‹ค. 

 

๊ทธ๋Ÿผ ํด๋กœ์ €๋Š” ์™œ ์‚ฌ์šฉํ• ๊นŒ

๊ฐœ์ธ์ ์œผ๋กœ ํด๋กœ์ €๋Š” ๋‘ ๊ฐ€์ง€ ์ด์œ ์—์„œ ๊ฐ€์žฅ ํฐ ํž˜์„ ๋ฐœํœ˜ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

 

 

1. ์ „์—ญ ๋ณ€์ˆ˜ ์‚ฌ์šฉ์˜ ์–ต์ œ

์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด์ž.

๋‹จ์ˆœํžˆ sum์— num์„ ๋”ํ•˜๋Š” ์˜ˆ์ œ์ด๋‹ค. ์—ฌ๊ธฐ์„œ sum์€ ์ „์—ญ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š”๋ฐ ์ด๋ฅผ ํด๋กœ์ €๋ฅผ ํ†ตํ•ด์„œ ์—†์• ๋ณด์ž.

 

 

ํด๋กœ์ €๋ฅผ ํ†ตํ•ด์„œ ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ์—†์•ด๋‹ค. ์ด๋Š” ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ๋Œ€์•ˆ์ด๋‹ค. 

๋ณ€์ˆ˜์˜ ๊ฐ’์€ ์–ธ์ œ๋“ ์ง€ ๋ณ€๊ฒฝ์ด ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋Ÿฌํ•œ ๊ฐ€๋ณ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ตœ๋Œ€ํ•œ ์ง€์–‘ํ•˜๋Š” ๊ฒŒ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์•ˆ์ •์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•œ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ธก๋ฉด์—์„œ ํด๋กœ์ €๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ด๋‹ค. 

 

2. ์ •๋ณด์˜ ์€๋‹‰

 

์œ„์™€ ๋น„์Šทํ•œ ๋งฅ๋ฝ์ธ๋ฐ, ๊ฒฐ๊ตญ ์ž์œ ๋ณ€์ˆ˜๋Š” ์‚ด์•„์žˆ์ง€๋งŒ ์ด๋ฅผ ์ง์ ‘์ ์œผ๋กœ ์กฐ์ž‘ํ•  ์ˆ˜๋Š” ์—†๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์œ„์˜ ์˜ˆ์‹œ์—์„œ examAdd๋ฅผ ํ†ตํ•˜๋ฉด ๋‚ด๋ถ€์— ์กด์žฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ด๋Š” ํด๋ž˜์Šค ๊ธฐ๋ฐ˜์–ธ์–ด์˜ privateํ•œ ๋ถ€๋ถ„๊ณผ ์œ ์‚ฌํ•˜๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

ํด๋กœ์ €์—์„œ์˜ for๋ฌธ (with var)

for๋ฌธ๊ณผ varํƒ€์ž…์„ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์˜๋„์น˜์•Š์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด์ž.

 

Input

 

output

0,1,2,3,4๋ฅผ ์˜ˆ์ƒํ–ˆ์ง€๋งŒ 5๋งŒ ๋‚˜์˜ค๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด๋Š” i๊ฐ€ ์ „์—ญ๋ณ€์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ i๊ฐ€ 5๊นŒ์ง€ ๊ฐ„์ƒํƒœ์˜ ๊ฐ’์„ returnํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. 

 

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋Œ€์•ˆ์œผ๋กœ๋Š” ES6์˜ letํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. 

let์„ ์‚ฌ์šฉํ•˜๋ฉด var๋ฅผ let์œผ๋กœ๋งŒ ๊ณ ์ณ์คŒ์œผ๋กœ์จ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. let์ด ์ง€์—ญ๋ณ€์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

 

ํ•„์ž๊ฐ€ ์ž˜๋ชป ์ดํ•ดํ•œ ๊ฑธ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ ๋””ํ…Œ์ผํ•œ ๋‚ด์šฉ์„ ์ข€ ๋” ์‚ดํŽด๋ณด์ž. (์•„๋‹ˆ๋ผ๋ฉด ๋Œ“๊ธ€ ๋ถ€ํƒํ•ฉ๋‹ˆ๋‹ค)

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•จ์ˆ˜๋Š” ์„ ์–ธ๋  ๋•Œ์˜ ๋ณ€์ˆ˜๋ฅผ ๊ธฐ์–ตํ•œ๋‹ค. ์ฆ‰ i๋Š” ์ „์—ญ๋ณ€์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— 0~4๊นŒ์ง€ ์ง€๋‚˜์นœ ๊ฐ’์ธ 5๊ฐ€ ๋‹ด๊ธฐ๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ let๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ์ง€์—ญ๋ณ€์ˆ˜๊ธฐ ๋–„๋ฌธ์— ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋  ๋•Œ 0,1,2,3,4 ๊ฐ๊ฐ ๋‹ด๊ธฐ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. 

 

๋‹ค์Œ์€ ํด๋กœ์ €๋ฅผ ์ด์šฉํ•ด์„œ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

Input

output

 

Input์„ ์‚ดํŽด๋ณด๋ฉด ์ต๋ช…ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ํ•จ์ˆ˜๋ฅผ ๋ฐ”๋กœ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด์„œ ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋•Œ ์ธ์ž๋กœ ๋ฐ›๊ฒŒ๋˜๋Š” id๋Š” ์ž์œ ๋ณ€์ˆ˜๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๊ธฐ์–ตํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. 

 

 

Reference

https://developer.mozilla.org/ko/docs/Web/JavaScript/Closures

 

ํด๋กœ์ € - JavaScript | MDN

ํด๋กœ์ €๋Š” ํ•จ์ˆ˜์™€ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ์–ดํœ˜์  ํ™˜๊ฒฝ์˜ ์กฐํ•ฉ์ด๋‹ค. ํด๋กœ์ €๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณ€์ˆ˜์˜ ์œ ํšจ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•˜๋Š”์ง€(Lexical scoping)๋ฅผ ๋จผ์ € ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค.

developer.mozilla.org

https://poiemaweb.com/js-closure

 

Closure | PoiemaWeb

ํด๋กœ์ €(closure)๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ค‘์š”ํ•œ ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ๊ด€์‹ฌ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ํ•œ๋ฒˆ์ฏค์€ ๋“ค์–ด๋ณด์•˜์„ ๋‚ด์šฉ์ด๋‹ค. execution context์— ๋Œ€ํ•œ ์‚ฌ์ „ ์ง€์‹์ด ์žˆ์œผ๋ฉด ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต์ง€ ์•Š

poiemaweb.com

 

 

'javascript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ - this, bind  (0) 2022.05.07