๊ฐ์ธ ๊ณต๋ถ๋ฅผ ์ํด ์์ฑํ์ต๋๋ค
ํด๋ก์ (Closure)๋ (์๋ฐ์คํฌ๋ฆฝํธ ๊ณ ์ ๊ฐ๋ ์ด ์๋) ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ๋ฑ์ฅํ๋ ํน์ฑ ์ค ํ๋์ด๋ค.
ํ์ง๋ง ํด๋ก์ ๋ ๊ฐ์ฒด์งํฅ๊ณผ ํจ์ํ ๋ชจ๋๋ฅผ ์์ฐ๋ฅด๋ ๋งค์ฐ ์ค์ํ ๊ฐ๋
์ด๊ณ ,
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํ ๊ณ ๋์ด๋์ ํ
ํฌ๋์ ๊ตฌ์ฌํ๋๋ฐ ํ์์ ์ธ ๊ฐ๋
์ผ๋ก ํ์ฉ๋๋ค.
ํด๋ก์ (closure)๋ ๋ด๋ถํจ์๊ฐ ์ธ๋ถํจ์์ ๋งฅ๋ฝ(context)์ ์ ๊ทผํ ์ ์๋ ๊ฒ์ ๊ฐ๋ฅดํจ๋ค.
์ฆ, ํด๋ก์ ๋ ์ธ๋ถํจ์์ ์ปจํ ์คํธ์ ์ ๊ทผํ ์ ์๋ ๋ด๋ถํจ์๋ฅผ ๋ปํ๋ค.
ํจ์ ์์ ์ ์ธ๋ ๋ ๋ค๋ฅธ ํจ์. ์ฆ ์๋ ์ฝ๋์ inner()
๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
const outer = () => {
let a = 1;
const inner = () => {
return ++a
}
return inner;
}
const outer2 = outer();
console.log(outer2()); // 2
console.log(outer2()); // 3
ํจ์์ ์คํ ์ปจํ
์คํธ๊ฐ ์ข
๋ฃ๋ ํ์๋ LexicalEnvironment
๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ์์ง ๋์์์ ์ ์ธ๋๋ ๊ฒฝ์ฐ๋,
์ง์ญ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ ๋ด๋ถํจ์๊ฐ ์ธ๋ถ๋ก ์ ๋ฌ๋ ๊ฒฝ์ฐ๊ฐ ์ ์ผํ๋ค.
๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ์ด๋ค ๊ฐ์ ์ฐธ์กฐํ๋ ๋ณ์๊ฐ ํ๋๋ผ๋ ์๋ค๋ฉด
๊ทธ ๊ฐ์ ์์ง ๋์์์ ์ ์ธ์ํจ๋ค.
์ด๋ฐ ํ์์ผ๋ก ๋ค์ ํด๋ก์ ๋ฅผ ์ ์ํ๋ฉด,
ํด๋ก์ ๋? ์ด๋ค ํจ์ A์์ ์ ์ธํ ๋ณ์ a๋ฅผ ์ฐธ์กฐํ๋ ๋ด๋ถํจ์ B๋ฅผ ์ธ๋ถ๋ก ์ ๋ฌํ ๊ฒฝ์ฐ, A์ ์คํ ์ปจํ ์คํธ๊ฐ ์ข ๋ฃ๋ ์ดํ์๋ ๋ณ์ a๊ฐ ์ฌ๋ผ์ง์ง ์๋ ํ์์ ๋งํ๋ค
๋ด๋ถํจ์๋ฅผ ์ธ๋ถ๋ก ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์๋ ํจ์๋ฅผ return
ํ๋ ๊ฒฝ์ฐ๋ฟ ์๋๋ผ, ์ฝ๋ฐฑ์ผ๋ก ์ ๋ฌํ๋ ๊ฒฝ์ฐ๋ ํฌํจ๋๋ค.
ํด๋ก์ ๋ ๊ทธ ๋ณธ์ง์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณ์ ์ฐจ์งํ๋ ๊ฐ๋ ์ด๋ฏ๋ก ๋ ์ด์ ์ฌ์ฉํ์ง ์๊ฒ ๋ ํด๋ก์ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐจ์งํ์ง ์๋๋ก ๊ด๋ฆฌํด์ฃผ์ด์ผ ํ๋ค.
๊ด๋ฆฌ ๋ฐฉ๋ฒ์ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ 0์ผ๋ก ๋ง๋ค๋ฉด ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ์๊ฑฐํ ํ
๋ฐ, ์ฐธ์กฐ ์นด์ดํธ๋ฅผ 0์ผ๋ก ๋ง๋๋ ๋ฐฉ๋ฒ์ ์๋ณ์์ ์ฐธ์กฐํ์ด ์๋ ๊ธฐ๋ณธํ ๋ฐ์ดํฐ(๋ณดํต null
๋๋ undefined
)๋ฅผ ํ ๋นํ๋ฉด ๋๋ค.
const outer = () => {
let a = 1;
const inner = () => {
return ++a
inner = null; // inner ์๋ณ์์ ํจ์ ์ฐธ์กฐ๋ฅผ ๋์
}
return inner;
}
console.log(outer());
console.log(outer());
outer = null; // outer ์๋ณ์์ inner ํจ์ ์ฐธ์กฐ๋ฅผ ๋์
ํด๋ก์ ๋ ์ด๋ค ํจ์์์ ์ ์ธํ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ ๋ด๋ถํจ์๋ฅผ ์ธ๋ถ๋ก ์ ๋ฌํ ๊ฒฝ์ฐ, ํจ์์ ์คํ ์ปจํ ์คํธ๊ฐ ์ข ๋ฃ๋ ํ์๋ ํด๋น ๋ณ์๊ฐ ์ฌ๋ผ์ง์ง ์๋ ํ์์ด๋ค.
๋ด๋ถํจ์๋ฅผ ์ธ๋ถ๋ก ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์๋ ํจ์๋ฅผ return
ํ๋ ๊ฒฝ์ฐ๋ฟ ์๋๋ผ, ์ฝ๋ฐฑ์ผ๋ก ์ ๋ฌํ๋ ๊ฒฝ์ฐ๋ ํฌํจ๋๋ค.
ํด๋ก์ ๋ ๊ทธ ๋ณธ์ง์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณ์ ์ฐจ์งํ๋ ๊ฐ๋ ์ด๋ฏ๋ก ๋ ์ด์ ์ฌ์ฉํ์ง ์๊ฒ ๋ ํด๋ก์ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐจ์งํ์ง ์๋๋ก ๊ด๋ฆฌํด์ผ ํ๋ค.