์ด์ ์ค๋ ๋๋ฅผ ๊ดด๋กญํ๋ ํด๋ก์ ...์ ๋ค๊ธฐ ์ ๊น์ง ์์ ๋ณด๊ณ ๋
ธํธ์ ๊ทธ๋ ค๋ณด๊ณ ํ๋ฉด์ ์ดํดํ๋ ค๊ณ ๋
ธ๋ ฅํ๋ ๊ฒ ๊ฐ๋ค.
์ด์ ์๋ฒฝํ๊ฒ ๊ทธ๋๋ ์กฐ๊ธ์ ์ค๋ช
ํ ์ ์์ ์ ๋์ ์ดํด๊ฐ ๋์ด ํฌ์คํ
์ ํ๊ณ ์ํ๋ค.
์ด ๊ธ์ ๋ณด๊ธฐ ์ ์ ๋ ์์ปฌ ์ค์ฝํ ์ดํด ํ์ !!
ํด๋ก์ ์ ๋ํ ์ ์๋ฅผ ๋จผ์ ๋ณด์๋ฉด MDN์ ์ด๋ ๊ฒ ์ ์ํ๋ค.
ํด๋ก์ ๋ ํจ์์ ๊ทธ ํจ์๊ฐ ์ ์ธ๋์ ๋์ ๋ ์์ปฌ ํ๊ฒฝ๊ณผ์ ์กฐํฉ์ด๋ค.
์ ์๋ง ๋ด์๋ ์ฌ์ค ์ดํด๊ฐ ๊ฐ์ง ์์์, ๊ฐ๋จํ ์์ ๋ฅผ ํ์ธํด๋ณด์!
์์ ๊ฐ์ ์ฝ๋์์ ์ดํด๋ณด๋ฉด,
makeGreeting ํจ์๋ ๋ด๋ถ ํจ์๋ฅผ ๋ฐํํ๋ฉด์ ์ข
๋ฃ๋์ด call stack์์ ์ฌ๋ผ์ง๊ฒ ๋๋ค. ์ฆ, ๋ณ์ greeting์ ์ ๊ทผํ ์ ์๊ฒ ๋์๋ค.
ํ์ง๋ง ๋ฉ๋ชจ๋ฆฌ์์ ์ฌ๋ผ์ก์์๋ ๋ถ๊ตฌํ๊ณ ,
world์ daseul์ greetig ๋ณ์๋ฅผ ๊ธฐ์ตํ์ฌ Hello, World!์ Hello, Daseul!์ ์ถ๋ ฅํ๊ฒ ๋๋ค.
์ด์ฒ๋ผ, ์์ ์ ํฌํจํ๊ณ ์๋ ์ธ๋ถ ํจ์๋ณด๋ค ๋ด๋ถ ํจ์๊ฐ ๋ ์ค๋ ์ ์ง๋๋ ๊ฒฝ์ฐ, ์ธ๋ถ ํจ์ ๋ฐ์์ ๋ด๋ถ ํจ์๊ฐ ํธ์ถ๋๋๋ผ๋ ์ธ๋ถ ํจ์์ ์ง์ญ ๋ณ์์ ์ ๊ทผํ ์ ์๋ ๊ฒ์ด ๋ฐ๋ก ํด๋ก์ (Clousre)
๊ทธ๋ ๋ค๋ฉด, ํด๋ก์ ๋ฅผ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ผ๊น?
ํด๋ก์ ๋ฅผ ์ด์ฉํ์ฌ ๋ด๋ถ ๋ณ์์ ํจ์๋ฅผ ์จ๊ธธ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ์๋ํ๋ผ๊ณ ํ๋ค. ์๋ํ๋ฅผ ํตํด ์ธ๋ถ์์ ๋ณ์์ ์ ๊ทผํ ์ ์๋๋ก ํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ชจ๋ ๊ฐ์ฒด๋ ํ๋กํผํฐ๋ค์ ์ธ๋ถ ์ ๊ทผ์ด ๋ชจ๋ ํ์ฉ๋๊ธฐ ๋๋ฌธ์, ํด๋ก์ ์ธ์๋ ์ฐจ๋จํ ๋ฐฉ๋ฒ์ด ์๋ค.
์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด
์ธ๋ถ์์๋ privateCounter ๋ณ์์ ์ ๊ทผํ ์ ์์ผ๋ฉฐ,
๋ด๋ถ ํจ์์ธ changBy ํจ์ ์ญ์ ์ธ๋ถ์์ ์กฐ์ํ ์ ์๋ค.
๋ฐ๋ผ์ ๋ฐํ๋ ํจ์์ ์ํด์๋ง, ๊ฐ์ ์กฐ์์ด ๊ฐ๋ฅํ๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก private ์์ฑ์ ๋ง๋ ๊ฒ์ด๋ผ ๋ณผ ์ ์๋ค.
ํด๋ก์ (Closure)๋ฅผ ์ ์๋ค๋ฉด ์๊ธฐ ํ๋ ๋ฒ๊ทธ ์์ ์ด ๊ฐ๋ฅํ๋ค.
์๋์ ๋ฐ๋ณต๋ฌธ ์์๋ฅผ ์ดํด๋ณด์ !
0, 1, 2, 3, 4๊ฐ ์์ฐจ์ ์ผ๋ก ์ถ๋ ฅ๋ ๊ฒ์ด๋ผ ์์ํ์ง๋ง,
๊ฒฐ๊ณผ์ ์ผ๋ก 5๊ฐ 5๋ฒ ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด๋ setTimeout์ด ํธ์ถ๋์ด Web API๋ฅผ ๊ฑฐ์ณ Task queue๋ก ์ด๋ํ๋ ๋์, for loop๊ฐ 5๋ฒ ์คํ๋์ด ์ด๋ฏธ i๋ 5๊ฐ ๋์ด์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์, ๋ชจ๋ setTimeout์ callbackํจ์๊ฐ i๋ฅผ ์ฐธ์กฐํ๋ฏ๋ก 5๊ฐ 5๋ฒ ์ถ๋ ฅ๋๊ฒ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด i๋ฅผ ์์ฐจ์ ์ผ๋ก ์ถ๋ ฅ์ํค๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
์ฒซ๋ฒ์งธ๋ก๋ ์ฆ์ ์คํ ํจ์๋ฅผ ์ด์ฉํ์ฌ ๋ฃจํ๋ง๋ค ํด๋ก์ ๋ฅผ ๋ง๋ค์ด i๋ฅผ number๊ฐ์ ๊ฐ๊ฐ ์ ์ฅํ๋ ๋ฐฉ์์ด ์๋ค.
๋ฃจํ๋ง๋ค number๊ฐ์ด ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ์์ฐจ์ ์ผ๋ก ๊ฐ์ ์ถ๋ ฅํ ์ ์๋ค.
๋ค์์ผ๋ก๋, for ๋ฃจํ ๋ด๋ถ์ let์ ์ ์ธํ์ฌ ๋งค ๋ฃจํ๋ง๋ค ํด๋ก์ ๋ฅผ ์์ฑ์ํค๋ ๋ฐฉ์์ด๋ค. let์ ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ์ด๊ธฐ ๋๋ฌธ์ ๋งค๋ฒ ํด๋ก์ ๋ฅผ ์๋กญ๊ฒ ์์ฑํ๊ฒ ๋๋ค.
๋ฐ๋ผ์ setTimeout์ callback ํจ์๊ฐ ๊ฐ๊ฐ์ i๋ฅผ ์ฐธ์กฐํ์ฌ ์์ฐจ์ ์ผ๋ก ๊ฐ์ ์ถ๋ ฅํ ์ ์๋ค.
ํด๋ก์ ๋ฅผ ์ดํดํ๊ธฐ์ํด ์ ๋ง ๋ง์ ๊ฒ์๊ณผ ๊ณ ์์ ํ๋ ๊ฒ ๊ฐ๋ค...
์์ง ์๋ฒฝํ๊ฒ ์ดํดํ๋ค๊ณ ๋ ํ ์ ์์ง๋ง, ๊ทธ๋๋ ํด๋ก์ ๊ฐ ์ด๋ค ๊ฐ๋
์ด๊ณ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง๋ฅผ ์๊ฒ ๋์๋ค. ์ฝ๋ฉ์ ํ๋ฉด์ ๊ณ์ํด์ ์ตํ๋๊ฐ์ผ๊ฒ ๋ค.
ํด๋ก์ ์ ํด๋ก์ ์ฌ์ฉ ์์
https://velog.io/@proshy/JS%ED%81%B4%EB%A1%9C%EC%A0%B8closure%EC%99%80-%ED%81%B4%EB%A1%9C%EC%A0%B8%EC%9D%98-%EC%82%AC%EC%9A%A9-%EC%98%88%EC%A0%9C
ํด๋ก์
https://poiemaweb.com/js-closure
ํด๋ก์
https://sungjk.github.io/2016/10/03/Closure.html