[Front-end] - ํด๋ก์ (Closure)
ํด๋ก์ ธ๋?
ํด๋ก์ ธ๋ ๋ด๋ถํจ์๊ฐ ์ธ๋ถํจ์์ ์คํ ์ปจํ ์คํธ์ ์ ๊ทผํ ์ ์๋ ๊ฒ์ ๊ฐ๋ฅดํจ๋ค.
ํด๋ก์ ธ๋ ํจ์์ ํจ์์ ์ํด ์์ฑ๋๋ ๋ฒ์ ๊ฐ์ฒด๋ฅผ ํจ๊ป ์ง์นญํ๋ ์ฉ์ด.
function makeAdder(a) {
return function (b) {
return a + b
}
}
var add5 = makeAdder(5)
var add20 = makeAdder(20)
add5(6) // 11
add20(7) // 27
์๋ฐ์คํฌ๋ฆฝํธ๋ ํจ์๊ฐ ์คํ๋ ๋ ์ธ์ ๋, โ๋ฒ์โ ๊ฐ์ฒด(์คํ ์ปจํ
์คํธ)๊ฐ ์์ฑ๋์ด ํด๋น ํจ์๋ด์์ ์์ฑ๋ ์ง์ญ ๋ณ์๋ฅผ ์ฌ๊ธฐ์ ์ ์ฅํ๋ค.
ํจ์ ๋งค๊ฐ๋ณ์๋ก์ ๋๊ฒจ์ง ์ด๋ค ๋ณ์๋ผ๋ ์ฌ๊ธฐ์ ์ด๊ธฐ๊ฐ์ผ๋ก ์ ์ฅํ๊ณ ์ด๊ฒ์ ๋ชจ๋ ์ ์ญ๋ณ์์ ํจ์๊ฐ ๋ค์ด์๋ ์ ์ญ ๊ฐ์ฒด์ ๋น์ทํ์ง๋ง ์ฐจ์ด์ ์ด ์๋ค.
- ํจ์๊ฐ ์คํ๋ ๋๋ง๋ค ์๋ก์ด ๋ฒ์ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค๋ ์ .
- ์ ์ญ ๊ฐ์ฒด์ ๋ฌ๋ฆฌ ๋ฒ์๊ฐ์ฒด๋ JavaScript ์ฝ๋์์ ์ง์ ์ ์ผ๋ก ์ก์ธ์คํ ์ ์๋ค๋ ์ .
- ํ์ฌ ๋ฒ์ ๊ฐ์ฒด์ ์์ฑ์ ๋ฐ๋ณต ์ ๊ทผํ ์ ์๋ ์๋จ์ด ์์.
๋ฐ๋ผ์ ํจ์๊ฐ ํธ์ถ๋๋ฉด, ๋ฒ์ ๊ฐ์ฒด๋ ํธ์ถ๋ ํจ์์ ๋ด์ฉ์ ์์ฑ์ผ๋ก ๊ฐ์ง ์ํ๋ก ์์ฑ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก JavaScript์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ์์ฑ๋ ๋ฒ์ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํด์ผํ์ง๋ง, ๋ฆฌํด๋ ํจ์๊ฐ ์ฌ์ ํ ๋ฒ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ ์ํ์์๋ ์ ๊ฑฐํ์ง ์๋๋ค.
๋ฒ์ ๊ฐ์ฒด๋ JavaScript ๊ฐ์ฒด ์ฒด๊ณ์์ ์ฌ์ฉ๋๋ prototype ์ฌ์ฌ๊ณผ ๋น์ทํ ๋ฒ์ ์ฌ์ฌ์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ ์ฌ์ฌ์ ํ์ฑํ๋ค.
๋ฉ๋ชจ๋ฆฌ ๋์
ํด๋ก์ ธ์ ๋ถ์์ฉ์ Internet Explorer์์ ๋ฐ์ํ๊ณคํ๋ค. ๊ฐ๋ฐ์ง ์ปฌ๋ ํฐ๋ ๊ฐ์ฒด๊ฐ ์์ฑ๋จ์ ๋ฐ๋ผ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋๊ณ , ์ฌ์ฉํ๊ณ ๋ ๋ฉ๋ชจ๋ฆฌ๋ ๋ ์ฐธ์กฐํ๋ ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ์์ ๋ ๋๋์๊ฐ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
๋ธ๋ผ์ฐ์ ํธ์คํธ๋ HTML ํ์ด์ง์ DOM ๊ฐ์ฒด๋ก์ ํํ๋์ด์๋ ๋ง์ ์์ ๊ฐ์ฒด๋ฅผ ๋ค๋ค์ผํ๋ค. ์ด ๊ฐ์ฒด๋ค์ ์ด๋ป๊ฒ ํ ๋นํ๊ณ ๋ค์ ๊ฑฐ๋ฌ๋ค์ผ์ง๋ ๋ธ๋ผ์ฐ์ ์ฑ ์์ด๋ค.
Internet Explorer๋ ์ด๋ฅผ ์ํด ์์ ๋ง์ ๊ณ ์ ํ, JavaScript์๋ ๋ค๋ฅธ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋ฐฉ์์ ์ฌ์ฉํ๋๋ฐ ์ด ๊ณผ์ ์์ ๋ฉ๋ชจ๋ฆฌ ๋์ถ์ด ๋ฐ์ ํ ์ ์๋ค.
IE์์ ๋ฉ๋ชจ๋ฆฌ ๋์ถ์ JavaScript ๊ฐ์ฒด์ ๊ต์ ๊ฐ์ฒด๊ฐ์ ์ฐธ์กฐํ๋ ์ค ์๊ธฐ ์์ ์ ์ฐธ์กฐ(์ํ์ฐธ์กฐ)ํ๊ฒ ๋๋ ์ผ์ด ๋ฐ์ํ ๊ฒฝ์ฐ๋ผ๋ฉด ์ธ์ ๋ ์ง ๋ฐ์ํ๊ฒ ๋๋ค.
function leakMemory() {
var el = document.getElementById('el')
var o = { el }
el.o = o
}
์ ์ฝ๋๋ ์ํ ์ฐธ์กฐ๋ก์ ๋ฉ๋ก ๋์ถ์ ์ผ์ผํจ๋ค. IE๋ ์์ ํ ๋ค์ ์์๋๊ธฐ ์ ๊ฐ์ง๋ el
์ o
์ ์ํด ์ฌ์ฉ๋๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐํํ์ง ๋ชปํ๋ค.
๋ฉ๋ชจ๋ฆฌ ๋์ถ์ ์ค๋ซ๋์ ์คํ๋๊ฑฐ๋ ํฐ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ๋ฐ๋ณต, ์ํ์ ์ํด ๋์ถ๋๋ ๋ฉ๋ชจ๋ฆฌ ์์ด ๋ง์ ๊ฒฝ์ฐ์์ ์ค์ง์ ์ผ๋ก ๊ณ ๋ คํ ๋งํ ๊ฐ์น๊ฐ ์๊ธด๋ค.
๋์ถ์ ์ผ์ผํค๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ์์ฐจ๋ก์ ๊ฑธ์น ์ฐธ์กฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ด์ ์ํ์ฐธ์กฐ๋ฅผ ํ๊ณ ์๋์ง ๋ช ํํ์ง ์์ ๊ฒฝ์ฐ๊ฐ ๋ ๋ง๋ค.
ํด๋ก์ ธ๋ ๊ทธ๋ ๊ฒ ๋๋๋ก ํ์ง์์๋ ๊ฐ๋จํ๊ฒ ๋ฉ๋ชจ๋ฆฌ ๋์ถ์ ์ผ์ผํฌ ์ ์๋ค.
function addHandler() {
var el = document.getElementById('el')
el.onclick = function () {
this.style.backgroundColor = 'red'
}
}
์ ์ฝ๋๋ ํด๋ฆญ์ ๋ฐฐ๊ฒฝ์์ ๋นจ๊ฐ์ผ๋ก ๋ฐ๊พธ๋ ์๋ฆฌ๋ฉํธ๋ฅผ ์ค์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฉ๋ชจ๋ฆฌ ๋์ถ๋ ์ผ์ผํจ๋ค.
๊ทธ ์ด์ ๋ el
์ ์ฐธ์กฐํ๋ฉด ์๋์๋ ๋ฌ๋ฆฌ ์ต๋ช
๋ด๋ถ ํจ์ ๋๋ฌธ์ ์์ฑ๋ ํด๋ก์ ธ ๋ด์ ๋ถ์กํ ์๊ฒ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ JavaScript ๊ฐ์ฒด (๋ด๋ถํจ์)์ ์์ ๊ฐ์ฒด (el
)๊ฐ์ ์ํ ์ฐธ์กฐ๋ฅผ ๋ง๋ ๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋
function addHandler() {
var el = document.getElementById('el')
el.onclick = function () {
this.style.backgroundColor = 'red'
}
el = null
}
์ด๋ ๊ฒ ํ๋ฉด ์ํ ์ฐธ์กฐ ๊ณ ๋ฆฌ๋ฅผ ๋์ ์ ์๋ค.
๋, ํด๋ก์ ธ์ ์ํด ๋ฐ์ํ ์ํ ์ฐธ์กฐ๋ฅผ ๋๊ธฐ ์ํด์๋ ๋ค๋ฅธ ํด๋ก์ ธ๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
function addHandler () {
var clickHandler = function () {
this.style.backgroundColor = 'red'
}
(function () {
val el = document.getElementById('el')
el.onclick = document.getElementById('el')
el.onclick = clickHandler
})()
}
๋ด๋ถ ํจ์๋ ์คํ๋๊ณ ๋ฐ๋ก ์ฌ๋ผ์ง๋ฏ๋ก, clickHandler
์ ํจ๊ป ์์ฑ๋ ํด๋ก์ ธ๋ก๋ถํฐ ๊ทธ ๋ด์ฉ์ ์จ๊ธด๋ค.
์ฐธ๊ณ