
๐ JavaScript ํด๋ก์ (Closuer)
์์ ํฌ์คํ ์์ ์ดํด๋ดค๋ ๊ฒ์ฒ๋ผ
์๋ฐ์คํฌ๋ฆฝํธ์์๋ ํจ์๊ฐ ๋ณ์๋ฅผ ์ฐพ์ ๋ ์ค์ฝํ ์ฒด์ธ์ ๋ฐ๋ผ ๋ฐ๊นฅ์ชฝ๊น์ง ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๊ฒ ๋๋ค.
(์ด์ ํฌ์คํ ์ฐธ๊ณ )
[๋ฆฌ์กํธ ๊ธฐ์ด ์คํฐ๋] JavaScript ์ค์ฝํ ์ฒด์ธ (Scope Chain)
๋ชฉ์ฐจ (OPEN)๐ JavaScript ์ค์ฝํ ์ฒด์ธ (Scope Chain)๐ฅ ์ค์ฝํ ์ฒด์ธ์ ๊ธฐ๋ณธ ์๋ฆฌ๐ง ์์ ๋ก ์ดํด๋ณด๊ธฐ๐ ๊ฒฐ๋ก ๐ JavaScript ์ค์ฝํ ์ฒด์ธ (Scope Chain)์์ ํฌ์คํ ์์ ์ดํด๋ดค๋ฏ์ด, ๋ณ์์๋ ์ ์ญ ์ค์ฝํ, ์ง
sso-codingdiary.tistory.com
๊ทธ๋ฐ๋ฐ ์ด๋ ํ ๊ฐ์ง ํน๋ณํ ํ์์ด ์๊ธฐ๋๋ฐ, ์ด๊ฒ ๋ฐ๋ก ํด๋ก์ (Closuer)์ด๋ค.
๊ฐ๋ตํ๊ฒ ๋งํ์๋ฉด ํด๋ก์ ๋,
ํจ์๊ฐ ์์ ์ด ์ ์ธ๋ ๋น์์ ์ค์ฝํ(ํ๊ฒฝ)๋ฅผ ๊ธฐ์ตํด์,
๊ทธ ์ค์ฝํ ๋ฐ๊นฅ์์ ์คํ๋๋๋ผ๋ ์ ๊ทผํ ์ ์๋ ํ์์ ๋งํ๋ค.
์กฐ๊ธ ์ด๋ ต๊ฒ ๋๊ปด์ง ์๋ ์๋๋ฐ,
๊ทธ๋ฅ 'ํจ์๊ฐ ํ์ด๋ฌ์ ๋น์์ ์ฃผ๋ณ ํ๊ฒฝ์ ํ์ ๊ธฐ์ตํ๋ ๋ฅ๋ ฅ'์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
๐ฅ ์์ 1) ๊ธฐ๋ณธ์ ์ธ ํด๋ก์
function outer() {
let count = 0; // outer ํจ์์ ์ง์ญ ๋ณ์
function inner() {
count++;
console.log(count);
}
return inner; // inner ํจ์ ๋ฐํ
}
count colsuerFunc = outer();
closureFunc(); // 1
closureFunc(); // 2
closureFunc(); // 3
์ด ์์ ์ฝ๋์์ ์ผ์ด๋๋ ์ผ์ ์๋์ ๊ฐ๋ค.
- outer() ๊ฐ ์คํ๋๋ฉด์ count = 0์ด ์๊ธฐ๊ณ , inner ํจ์๋ฅผ ๋ฐํํ๋ค.
- closuerFunc์ inner๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
(outer ํจ์๊ฐ inner ํจ์๋ฅผ ๋ฐํํ์ผ๋๊น) - inner ๋ฅผ ์คํํ ๋๋ง๋ค count์ ์ ๊ทผํด์ ๊ฐ์ ๋ฐ๊ฟ ์ ์๋ค.
์ฌ๊ธฐ์์ ์ฃผ๋ชฉํ ์ ์ด, ์๋๋ผ๋ฉด outer ์คํ์ด ๋๋๋ฉด count ๋ ์ฌ๋ผ์ ธ์ผ ํ๋๋ฐ,
inner ๊ฐ count๋ฅผ ๊ณ์ ๊ธฐ์ตํ๊ณ ์๊ธฐ ๋๋ฌธ์ count ๊ฐ ์ด์๋จ๋๋ค๋ ์ ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ ๋ฐ๋ก ํด๋ก์ ์ด๋ค.
๐ง ์์ 2) ํด๋ก์ ์์ด ๊ตฌํํ์ ๋์ ๋น๊ตํด๋ณด๊ธฐ
let count = 0;
function increase() {
count++;
console.log(count);
}
increase(); // 1
increase(); // 2
increase(); // 3
์ด๋ ๊ฒ ํด๋ ์์ ์์ 1์์ ๋ดค๋ ๊ฒ์ฒ๋ผ 1 2 3 ์ด ์ถ๋ ฅ๋๊ธฐ๋ ํ์ง๋ง,
์ด ์ฝ๋์์๋ count ๊ฐ ์ ์ญ์ ๋ ธ์ถ๋์ด ์๋ค.
๋ฐ๋ผ์ ๋๊ตฌ๋ count ๊ฐ์ ๋ฐ๊ฟ๋ฒ๋ฆด ์๊ฐ ์๋ค๋ ์ํ์ด ์๋ค.
์ด ์ฝ๋์ ์์ 1์ ์ฝ๋๋ฅผ ๋น๊ตํด๋ณด๋ฉด ํด๋ก์ ์ ์ฅ์ ์ด ํ์ฐํ ๋๋ฌ๋๋ค.
๋ฐ๋ก, ๋ฐ์ดํฐ ์๋๊ณผ ์์ ํ ์ํ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๊ฒ ๋๋ค๋ ์ ์ด๋ค.
(์ค์ ๋ก ์์ 1์ ์ฝ๋์์๋ count ๋ฅผ ์ธ๋ถ์์ ์ง์ ๊ฑด๋๋ฆฌ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๊ณ ,
์ค์ง inner ํจ์๋ฅผ ํตํด์๋ง ์ ์ดํ ์ ์์๋ค๋ ๊ฒ์ ๋ณด๋ฉด ์ ์ ์๋ค.)
๐จ ์์ 3) ์ฌ๋ฌ ํด๋ก์ ์ธ์คํด์ค
๊ทธ๋ ๋ค๋ฉด ์ด ์ฝ๋๋ ์ด๋จ๊น?
function makeCounter() {
let num = 0;
return function () {
num++;
return num;
};
}
const counter1 = makeCounter();
const counter2 = makeCounter();
console.log(counter1()); // 1
console.log(counter1()); // 2
console.log(counter2()); // 1 (counter1๊ณผ๋ ๋ณ๊ฐ๋ก ๋์ํจ)
์ด ์ฝ๋์์๋ counter1์์ makeCounter๋ฅผ ํธ์ถํ ๋์
counter2์์ makeCounter๋ฅผ ํธ์ถํ ๋
์๋ก ๋ค๋ฅธ ๋ ๋ฆฝ์ ์ธ ํ๊ฒฝ(num)์ด ๋ง๋ค์ด์ง๊ฒ ๋๋ค.
๊ทธ๋์ ๋น์ฐํ counter1๊ณผ counter2๋ ์๋ก ์ํฅ์ ์ฃผ์ง ์๊ฒ ๋๋ค.
์ด์ฒ๋ผ ํด๋ก์ ๋ง๋ค ๋ ๋ฆฝ์ ์ธ ๊ธฐ์ต ๊ณต๊ฐ์ ๊ฐ์ง๋ค๋ ์ ์ ๊ต์ฅํ ์ค์ํ ํฌ์ธํธ๋ค !
๐ฉ ์ค์ฝํ ์ฒด์ธ๊ณผ ํด๋ก์ ์ ๊ด๊ณ
๋ด๊ฐ ์ฒ์ ์ด ์์๋ค๊ณผ ํจ๊ป ์ค์ฝํ๋ฅผ ๊ณต๋ถํ ๋,
'์ค ~~ ์ ๊ธฐํ๋ค !!' ํ๋ฉด์ ์ญ ๋ณด๊ธด ํ๋๋ฐ ..
๋ฌธ๋ ๋ค ๋ณด๊ณ ๋๋ '๊ทธ๋์ ๊ฒฐ๋ก ์ ์ผ๋ก ์ค์ฝํ์ฒด์ธ์ด๋ ํด๋ก์ ๊ฐ ๋ฌด์จ ๊ด๊ณ๋ผ๋ ๊ฑฐ์ง?' ์ถ์์๋ค.
๊ทธ๋์ ์ด๋ ๊ฒ ๋ค์ ํ ๋ฒ ์์ฝํด์ ์ ๋ฆฌํด๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
์ผ๋จ, ์ค์ฝํ ์ฒด์ธ์ด๋ผ๋ ๊ฒ์ ํจ์ ์์์ ๋ณ์๋ฅผ ์ฐพ์ ๋
์๊ธฐ ์ค์ฝํ ๐๐ป ๋ฐ๊นฅ ์ค์ฝํ ๐๐ป ๊ทธ ๋ฐ๊นฅ ์ค์ฝํ ๐๐ป ... ๐๐ป ์ ์ญ ์ค์ฝํ
์ด๋ฐ ์์ผ๋ก ๋ฐ์ผ๋ก๋ง ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ฉฐ ํ์ํ๋ค๋ ๊ฒ์ด์๋ค.
์ฆ, ์ฌ๊ธฐ๊น์ง์์์ ํต์ฌ์,
ํจ์๋ ์์ ์ด ์ ์ธ๋ ๋น์์ ์ค์ฝํ๋ฅผ ๊ธฐ์ตํ๋ค๋ ์ ์ด๋ค.
(๊ธฐ์ต์ ํ๋๊น ์๊ธฐ ์ค์ฝํ๋ถํฐ ์์ํด์ ๋ฐ๊นฅ ์ค์ฝํ๋ก ํ์์ ํ๊ฒ ์ฃ ?)
๊ทธ๋ผ ์ด์ ํด๋ก์ ์ ๋ํด์ ๋ค์ ์ ๋ฆฌํด๋ณด๋ฉด,
ํจ์๊ฐ ์ ์ธ๋ ๋น์์ ์ค์ฝํ๋ฅผ ๊ธฐ์ตํด์, ๊ทธ ์ค์ฝํ ๋ฐ๊นฅ์์ ์คํ๋๋๋ผ๋ ์ ๊ทผํ ์ ์๋ ํ์์ด์๋ค.
๊ทธ๋์ ์๊น ๋ดค๋ ์์ ๋ฅผ ๋ค์ ๊ฐ์ ธ์์ ์ค๋ช ํ์๋ฉด,
function outer() {
let count = 0; // outer ํจ์์ ์ง์ญ ๋ณ์
function inner() {
count++;
console.log(count);
}
return inner; // inner ํจ์ ๋ฐํ
}
count colsuerFunc = outer();
closureFunc(); // 1
closureFunc(); // 2
closureFunc(); // 3
- inner ํจ์๊ฐ ์คํ๋ ๋ count ๋ณ์๋ฅผ ์ฐพ๋๋ค.
- ์ผ๋จ ์๊ธฐ ์ค์ฝํ์๋ ์์ผ๋๊น ์ค์ฝํ ์ฒด์ธ์ ๋ฐ๋ผ outer ์ค์ฝํ๋ก ์ฌ๋ผ๊ฐ๋ค.
- ๊ทธ๋์ outer ์ ์ง์ญ ๋ณ์์ธ count๋ฅผ ๊ณ์ ์ธ ์ ์๋ ๊ฒ์ด๋ค.
์ด์ฒ๋ผ, ๋น๋ก outer() ์ ์คํ์ ๋๋๊ธด ํ์ง๋ง,
inner๊ฐ outer์ ํ๊ฒฝ์ ์ค์ฝํ ์ฒด์ธ์ผ๋ก ๊ธฐ์ตํ๊ณ ์์ผ๋ฏ๋ก count๋ฅผ ๊ณ์ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด๋ค.
๊ทธ๋์ ๋ค๋ค ํด๋ก์ ๋ ์ค์ฝํ ์ฒด์ธ์ ์ด์ฉํด์ ๋ฐ๊นฅ ๋ณ์๋ฅผ ๊ธฐ์ตํ๊ณ ํ์ฉํ๋ ๊ฒ์ด๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฑฐ์๋ค.
๐ ๊ฒฐ๋ก
์ฒ์ ํด๋ก์ ์ ๋ํด์ ์๊ฒ ๋์ ๋, '์ด๋ป๊ฒ ํจ์๊ฐ ์คํ์ด ๋๋๋๋ฐ ๋ณ์๋ฅผ ๊ณ์ ๊ธฐ์ตํ์ง?' ์ถ์๋๋ฐ,
์๊ณ ๋ณด๋ ์ด๊ฒ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ค์ฝํ ์ฒด์ธ ๋๋ถ์ ๊ฐ๋ฅํ ํ์์ด๋ผ๋ ๊ฒ์ ์ ์ ์์๋ค.
ํนํ ํด๋ก์ ๋ฅผ ์ด์ฉํ๋ฉด ์ธ๋ถ์์๋ ์ง์ ์ ๊ทผํ์ง ๋ชปํ๋ ๋น๋ฐ์ค๋ฌ์ด ๋ณ์๋ฅผ ๋ง๋ค ์ ์๋ค๋ ์ ์ด ๊ฐ์ฅ ์ธ์ ๊น์๋ค.
์์ผ๋ก๋ ํด๋ก์ ๋ฅผ ์ด์ฉํด์ ์์ ํ๊ฒ ์บก์ํํ๋ ์ต๊ด์ ๋ค์ฌ๋ ์ข์ ๊ฒ ๊ฐ๋ค.
'๐ป๊ณต๋ถ ๊ธฐ๋ก > ๐ ๋ฆฌ์กํธ ๊ธฐ์ด ์คํฐ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [๋ฆฌ์กํธ ๊ธฐ์ด ์คํฐ๋] JavaScript ๊ฐ์ฒด(Object) (1) | 2025.09.24 |
|---|---|
| [๋ฆฌ์กํธ ๊ธฐ์ด ์คํฐ๋] JavaScript ์ค์ฝํ ์ฒด์ธ (Scope Chain) (0) | 2025.09.23 |
| [๋ฆฌ์กํธ ๊ธฐ์ด ์คํฐ๋] JavaScript ์ค์ฝํ(scope) (0) | 2025.09.23 |
| [๋ฆฌ์กํธ ๊ธฐ์ด ์คํฐ๋] JavaScript ์ฝ๋ฐฑ ํจ์ (0) | 2025.09.21 |
| [๋ฆฌ์กํธ ๊ธฐ์ด ์คํฐ๋] JavaScript์ ์์ฑ์ ํจ์ ๋์ ๊ณผ์ (2) | 2025.09.20 |