...

์๋ฐ์คํฌ๋ฆฝํธ์ ํจ์๋ฅผ ๋ฆฌํดํ๋ ํจ์
ํด๋ก์ ์์๋ ๋ณด์๊ณ ์ฐ๋ฆฌ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ฉํ๋ฉด์ ๊ฐ๋ ํจ์ ์์ฒด๋ฅผ ๋ฆฌํดํ๋ ํจ์๋ฅผ ํ๋ฒ์ฏค์ ๋ณด์์ ๊ฒ์ด๋ค.
function hello(){
return function world(){
return "Hello Word";
}
}
const a = hello();
// == world()
โ์๋ฆฌ๋ ์๊ฒ ๋ค. ์ฌ์ฉ๋ฒ๋ ์๊ฒ ๋ค. ๊ทธ๋ฐ๋ฐ ๋์ฒด ์ด๋ฌํ ๊ธฐ๋ฒ์ด ์ด๋์ ์ฐ์ด๋๊ฑด๊ฐ? ์ ๊ตณ์ด ๊ฐ์ ๋ฆฌํดํ๋ฉด๋์ง ํจ์์์ ํจ์๋ฅผ ๋ฆฌํดํ๋๊ฐ? ์ง๊ธ๋ถํฐ return function() {} ์ ์ค์ฉ ๊ธฐ๋ฒ์ ์์๋ณด์.
์ผ๋ฐ์ ์ธ ์ด๋ฒคํธ ์ฝ๋ฐฑ ํจ์ ๋ฑ๋ก๋ฒ
์ฌ๊ธฐ ๋ฒํผ์ด 3๊ฐ ์๋ ์น๋ฌธ์๊ฐ ์๋ค.
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<button id="c1">C1</button>
<button id="c2">C2</button>
<button id="c3">C3</button>
<script>
</script>
</body>
</html>
์ฐ๋ฆฌ๋ ์ 3๊ฐ์ ๋ฒํผ๋ง๋ค ๋ค์๊ณผ ๊ฐ์ด ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ฑ๋กํ ์์ ์ด๋ค. addEventListenr ๋๋ฒ์งธ ์ธ์์๋ ํจ์๊ฐ ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ ์ต๋ช
ํจ์๋ก ์ฒ๋ฆฌํด์ฃผ์๋ค.
<body>
<button id="c1">C1</button>
<button id="c2">C2</button>
<button id="c3">C3</button>
<script>
document.getElementById('c1').addEventListener('click', function(){ console.log(1) });
document.getElementById('c2').addEventListener('click', function(){ console.log(1) });
document.getElementById('c3').addEventListener('click', function(){ console.log(1) });
</script>
</body>
์ฝ๋ ์์ฒด์ ๋ฌธ์ ๋ ์์ง๋ง ๊ฐ๋ง ๋ณด๋ฉด ์ฝ๋ ๋ฐ๋ณต์ด ๋ฐ์ํ๋ค. ๋ฐ๋ผ์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ํจ์๋ฅผ ๋ฐ์ผ๋ก ๋นผ์ ๋ฆฌํฉํ ๋ง ํ๋ค. c ๋ผ๋ ํจ์๋ฅผ ์๋ก ๋ง๋ค๊ณ ์ด๋ฒคํธ๋ฆฌ์ค๋์ ๋ฑ๋ก์ํค๋ฉด ๋๋ค. ๋ค๋ง ๋ชจ๋ ๋ค ์๋ค์ํผ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ธ์์๋ ํจ์ ์์ฒด๊ฐ ๋ค์ด๊ฐ์ผ ํ๋ค. ๋ง์ผ ํจ์ ์ธ์ ๋ถ๋ถ์ c()๋ก ๋ฃ๊ฒ ๋๋ฉด ๋ฆฌํด๊ฐ ์์ฒด๊ฐ ๋ค์ด๊ฐ๋ ๊ผด์ด ๋๊ธฐ ๋๋ฌธ์ ํจ์ ์คํ์ด ๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
<script>
function c() {
console.log(1);
}
document.getElementById('c1').addEventListener('click', c);
document.getElementById('c2').addEventListener('click', c);
document.getElementById('c3').addEventListener('click', c);
</script>
์ด๋ฒคํธ ์ฝ๋ฐฑ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํด์ผ ํ ๊ฒฝ์ฐ
๊ทธ๋ฐ๋ฐ ๋ง์ผ ์คํ์ด ๋ณ๊ฒฝ๋์, ๊ฐ ๋ฒํผ๋ง๋ค ๋ค๋ฅธ ๋์์ ํ๋๋ก ๊ตฌํํ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น? ์๋ฅผ ๋ค์ด c1๋ฒํผ ๋๋ฅด๋ฉด 1์ด ์ถ๋ ฅ๋๊ฒ ๋ง๋ค๊ณ c3 ๋ฒํผ ๋๋ฅด๋ฉด 3์ด ์ถ๋ ฅ๋๊ฒ ๋ง๋ค๊ณ ์ถ๋ค. ์ด๋ ํจ์์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํ๋ผ๋ฏธํฐ ๋ณ์๊ฐ์ ์ถ๋ ฅํด์ฃผ๋ฉด ๋๋ ๋ฐฉ๋ฒ์ด๋ค. ํ์ง๋ง ๋ฌธ์ ๋ ์ด๋ป๊ฒ ์ค๊น? ์ด๋ค.
์๋์ ๊ฐ์ด ํ๋ฉด ์์ ๋งํ๋ค ์ถ์ด ๋ฆฌํด๊ฐ์ ๋ฃ์ด๋ฒ๋ฆฌ๋ ๊ผด์ด ๋๋ค. ๋ฒํผ ๋๋ฅด์ง๋ ์์๋๋ฐ๋ console.log() ํจ์๊ฐ ํ๋ฒ ์คํํ๊ณ ๋ง๋ ๊ธฐ์ ์ ๋ณผ ์ ์์ ๊ฒ์ด๋ค.
function c(n) {
console.log(n);
}
document.getElementById('c2').addEventListener('click', c(2));
์ฆ, c๋ก ์ฃผ๋ฉด ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์์๊ณ , c(2)๋ก ํ๋ฉด ํจ์ ์คํ์ด ์๋๊ฒ ๋๋ค. ์ ๋ฐฉ๋ฒ์ด ์๋๊ฑธ๊น? ๋ฌด์ํ๊ฒ ์ ์ญ๋ณ์๋ก ์ฒ๋ฆฌํ ๊น? ๋ผ๊ณ ์ถ์ง๋ง ์ฌ์ค ๊ฐ๋จํ๋ค.
ํจ์๋ฅผ ๋ฆฌํดํ๋ ํจ์๋ฅผ ์ด์ฉํ ํด๋ก์
โc()๋ก ์ด๋ฒคํธ๋ฆฌ์ค๋ ํจ์์ ๋ฑ๋กํ๋ฉด ๋์์ด ์ด์ํ๊ฒ ๋๋ ์ด์ ๋, ์ด๋ฒคํธ ๋ฆฌ์ค๋์๋ ํจ์๊ฐ ๋ฑ๋ก๋๋๊ฒ ์๋๋ผ ๋ฆฌํด๊ฐ์ด ๋ฃ์ด์ง๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ผ ์ด ์๋ฆฌ๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค. ํธ์ถํ ํจ์์์ ์์ ํจ์ ์์ฒด๋ฅผ ๋ฆฌํด ์์ผ๋ฒ๋ฆฌ๋ฉด, ๋ฆฌํด๊ฐ์ด ๊ณง ํจ์์ด๊ฒ ๋๊ณ , ์ด๋ ๊ณง ํจ์ ๋ฑ๋ก์ด ๋์ง ์์๊น?
function c(n) {
return function(){
console.log(n);
}
}
document.getElementById('c1').addEventListener('click', c(1));
document.getElementById('c2').addEventListener('click', c(2));
document.getElementById('c3').addEventListener('click', c(3));
์ด๋ ๊ฒ ํ๋ฉด ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ ํจ์๊ฐ ๋ฆฌํด๋ ํจ์๋ฅผ(ํด๋ก์ ์ฒ๋ฆฌ๊ฐ ๋) ๋ฑ๋กํ๊ฒ ๋ ๊ผด์ด ๋๋ค.
[JS] ๐ ํด๋ก์ (Closure) ๊ฐ๋ ์๋ฒฝ ์ ๋ฆฌ
ํด๋ก์ (closure) ๋? ํด๋ก์ ๋ ๋ฐํ๋ ๋ด๋ถํจ์๊ฐ ์์ ์ด ์ ์ธ๋์ ๋์ ํ๊ฒฝ(Lexical environment)์ธ ์ค์ฝํ๋ฅผ ๊ธฐ์ตํ์ฌ, ๋ง์ผ ์์ ์ด ์ ์ธ๋์ ๋์ ํ๊ฒฝ(์ค์ฝํ) ๋ฐ์์ ํธ์ถ๋์ด๋ ์ค์ฝํ์ ์ ๊ทผํ
inpa.tistory.com
ํ์ดํ ํจ์๋ก ํํํ๊ธฐ
์ข๋ ํจ์๋ฅผ ๋ฆฌํดํ๋ ํจ์ ์ฝ๋์์ ๊ฐ๊ฒฐํ๊ฒ ํ๊ธฐ ์ํด ํ์ดํ ํจ์๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํํ์ด ๊ฐ๋ฅํ๋ค.
const c = (n) => () => { //ํ์ดํ ํจ์๊ฐ ํ์ดํ ํจ์๋ฅผ ๋ฆฌํดํ๋ค.
console.log(n);
}
document.getElementById('c1').addEventListener('click', c(1));
document.getElementById('c2').addEventListener('click', c(2));
document.getElementById('c3').addEventListener('click', c(3));
โ์ฒ์๋ณด๋ฉด ๊ดด์ํ ๋ฌธ๋ฒ ํํ์ ํ๋ฅผ ๋ด๋๋ฅด๊ฒ ์ง๋ง ํ์คํ ์ฝ๋๋์ ์ค์ด๋ ๊ธฐ๋ฒ์ด๋ ์ต์ํด ์ง๋ ๊ฒ์ด ์ข๋ค.
์ด ๊ธ์ด ์ข์ผ์ จ๋ค๋ฉด ๊ตฌ๋ & ์ข์์
์ฌ๋ฌ๋ถ์ ๊ตฌ๋
๊ณผ ์ข์์๋
์ ์์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค.