[Front-end] - ํด๋กœ์ €(Closure)

October 20, 2022

ํด๋กœ์ ธ๋ž€?

ํด๋กœ์ ธ๋Š” ๋‚ด๋ถ€ํ•จ์ˆ˜๊ฐ€ ์™ธ๋ถ€ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ๊ฐ€๋ฅดํ‚จ๋‹ค.

ํด๋กœ์ ธ๋Š” ํ•จ์ˆ˜์™€ ํ•จ์ˆ˜์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋Š” ๋ฒ”์œ„ ๊ฐ์ฒด๋ฅผ ํ•จ๊ป˜ ์ง€์นญํ•˜๋Š” ์šฉ์–ด.

function makeAdder(a) {
  return function (b) {
    return a + b
  }
}
var add5 = makeAdder(5)
var add20 = makeAdder(20)
add5(6) // 11
add20(7) // 27

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์–ธ์ œ๋‚˜, โ€˜๋ฒ”์œ„โ€™ ๊ฐ์ฒด(์‹คํ–‰ ์ปจํ…์ŠคํŠธ)๊ฐ€ ์ƒ์„ฑ๋˜์–ด ํ•ด๋‹น ํ•จ์ˆ˜๋‚ด์—์„œ ์ƒ์„ฑ๋œ ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์—ฌ๊ธฐ์— ์ €์žฅํ•œ๋‹ค.
ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ์„œ ๋„˜๊ฒจ์ง„ ์–ด๋–ค ๋ณ€์ˆ˜๋ผ๋„ ์—ฌ๊ธฐ์— ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ์ €์žฅํ•˜๊ณ  ์ด๊ฒƒ์€ ๋ชจ๋“  ์ „์—ญ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด์žˆ๋Š” ์ „์—ญ ๊ฐ์ฒด์™€ ๋น„์Šทํ•˜์ง€๋งŒ ์ฐจ์ด์ ์ด ์žˆ๋‹ค.

  1. ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋ฒ”์œ„ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค๋Š” ์ .
  2. ์ „์—ญ ๊ฐ์ฒด์™€ ๋‹ฌ๋ฆฌ ๋ฒ”์œ„๊ฐ์ฒด๋Š” 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์™€ ํ•จ๊ป˜ ์ƒ์„ฑ๋œ ํด๋กœ์ ธ๋กœ๋ถ€ํ„ฐ ๊ทธ ๋‚ด์šฉ์„ ์ˆจ๊ธด๋‹ค.


์ฐธ๊ณ 

results matching ""

    No results matching ""