[JavaScript] ํด๋กœ์ €

ํด๋กœ์ €(closure)๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ณ ์œ ์˜ ๊ฐœ๋…์ด ์•„๋‹Œ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ค‘์š”ํ•œ ํŠน์„ฑ์œผ๋กœ MDN์—์„œ๋Š” ํด๋กœ์ €๋ฅผ "ํ•จ์ˆ˜์™€ ๊ทธ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ๊ณผ์˜ ์กฐํ•ฉ"์ด๋ผ๊ณ  ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํด๋กœ์ €๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„  ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•ด ์•Œ์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ํ•จ์ˆ˜๋ฅผ ์–ด๋””์„œ ์ •์˜ํ–ˆ๋Š”์ง€์— ๋”ฐ๋ผ ์ƒ์œ„ ์Šค์ฝ”ํ”„์ธ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„(์ •์  ์Šค์ฝ”ํ”„)๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. const x = 1; function foo () { const x = 10; bar(); } function bar () { console.log(X); } foo(); // 1 bar(); // 1 ์œ„ ์˜ˆ์ œ์˜ foo ํ•จ์ˆ˜์™€ bar ํ•จ์ˆ˜๋Š” ๋ชจ๋“œ ์ „์—ญ์—์„œ ์ •์˜๋œ ์ „์—ญ ํ•จ์ˆ˜๋กœ foo ํ•จ์ˆ˜์™€ bar ํ•จ์ˆ˜ ๋ชจ๋‘ ..

[JavaScript] ์‹คํ–‰ ์ปจํ…์ŠคํŠธ

์‹คํ–‰ ์ปจํ…์ŠคํŠธ(execution context)๋ž€? ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๊ณ  ์ฝ”๋“œ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์‹ค์ œ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์˜์—ญ์œผ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ํ•ต์‹ฌ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ์†Œ์Šค์ฝ”๋“œ์˜ ํƒ€์ž… ECMAScript ์‚ฌ์–‘์€ ์†Œ์Šค์ฝ”๋“œ๋ฅผ 4๊ฐ€์ง€ ํƒ€์ž…์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๋Š”๋ฐ ํƒ€์ž…์— ๋”ฐ๋ผ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •๊ณผ ๊ด€๋ฆฌ ๋‚ด์šฉ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์†Œ์Šค์ฝ”๋“œ ํƒ€์ž… ์„ค๋ช… ์ „์—ญ ์ฝ”๋“œ - ์ „์—ญ์— ์กด์žฌํ•˜๋Š” ์†Œ์Šค์ฝ”๋“œ - ์ตœ์ƒ์œ„ ์Šค์ฝ”ํ”„์ธ ์ „์—ญ ์Šค์ฝ”ํ”„ ์ƒ์„ฑ - ์ „์—ญ ์ฝ”๋“œ๊ฐ€ ํ‰๊ฐ€๋˜๋ฉด ์ „์—ญ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ ํ•จ์ˆ˜ ์ฝ”๋“œ - ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์กด์žฌํ•˜๋Š” ์†Œ์Šค์ฝ”๋“œ - ์ง€์—ญ ์Šค์ฝ”ํ”„๋ฅผ ์ƒ์„ฑ - ํ•จ์ˆ˜ ์ฝ”๋“œ๊ฐ€ ํ‰๊ฐ€๋˜๋ฉด ํ•จ์ˆ˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ eval ์ฝ”๋“œ - ๋นŒํŠธ์ธ ์ „์—ญ ํ•จ์ˆ˜์ธ eval ํ•จ์ˆ˜์— ์ธ์ž๋กœ ์ „๋‹ฌ๋˜์–ด ์‹คํ–‰๋˜๋Š” ์†Œ..