Closure

About

ν΄λ‘œμ €λŠ” μžμ‹ μ΄ 생성될 "λ•Œ"의 μŠ€μ½”ν”„μ—μ„œ μ•Œ 수 μžˆμ—ˆλ˜ λ³€μˆ˜λ₯Ό κΈ°μ–΅ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€. (ν΄λ‘œμ €κ°€ κΈ°μ–΅ν•˜λŠ” λ³€μˆ˜μ˜ 값은 λ³€ν•  수 μžˆλ‹€.)

  • μŠ€μ½”ν”„: λ³€μˆ˜λ₯Ό μ–΄λ””μ—μ„œ μ–΄λ–»κ²Œ 찾을지λ₯Ό μ •ν•œ κ·œμΉ™.

    • ν•¨μˆ˜λŠ” λ³€μˆ˜ μ°Έμ‘° λ²”μœ„λ₯Ό κ²°μ •ν•˜λŠ” μ€‘μš”ν•œ 기쀀이닀. ν•¨μˆ˜κ°€ μ€‘μ²©λ˜μ–΄ μžˆλ‹€λ©΄ μŠ€μ½”ν”„λ„ μ€‘μ²©λ˜μ–΄ μƒκ²¨λ‚œλ‹€.

    • κΈ€λ‘œλ²Œ μŠ€μ½”ν”„λ₯Ό μ œμ™Έν•œ μ™ΈλΆ€ μŠ€μ½”ν”„μ— μžˆμ—ˆλ˜ λ³€μˆ˜ 쀑, ν΄λ‘œμ € ν˜Ήμ€ λ‹€λ₯Έ λˆ„κ΅°κ°€κ°€ μ°Έμ‘°ν•˜κ³  μžˆμ§€ μ•Šμ€ λͺ¨λ“  λ³€μˆ˜λŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ λλ‚œ ν›„ 가비지 μ»¬λ ‰μ…˜ λŒ€μƒμ΄ λœλ‹€. μ–΄λ–€ ν•¨μˆ˜κ°€ μ™ΈλΆ€ μŠ€μ½”ν”„μ˜ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•˜κ³ , κ·Έλž˜μ„œ μ™ΈλΆ€ μŠ€μ½”ν”„μ˜ ν™˜κ²½μ΄ GC의 λŒ€μƒμ΄ λœλ‹€λ©΄, κ·Έλ ‡κ²Œ 내버렀 λ‘λŠ” ν•¨μˆ˜λ₯Ό ν΄λ‘œμ €λΌκ³  보긴 μ–΄λ ΅λ‹€.

function parent() {
  var a = 5
  function myfn() {
    console.log(a)
  }
  // ...
}

function parent2() {
  var a = 5
  function parent1() {
    function myfn() {
      console.log(a)
    }
    // ...
  }
  // ...
}

μ˜ˆμ‹œ

λ‹€μŒ f1은:

  • ν΄λ‘œμ €μ²˜λŸΌ μ™ΈλΆ€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜μ—¬ κ²°κ³Όλ₯Ό λ§Œλ“ λ‹€.

  • μƒμœ„ μŠ€μ½”ν”„μ˜ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜κ³  μžˆλ‹€.

ν•˜μ§€λ§Œ f1은 ν΄λ‘œμ €κ°€ μ•„λ‹ˆλ‹€.

κΈ€λ‘œλ²Œ μŠ€μ½”ν”„μ—μ„œ μ„ μ–Έλœ λͺ¨λ“  λ³€μˆ˜λŠ” κ·Έ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” ν•¨μˆ˜κ°€ μžˆλŠ”μ§€ μ—†λŠ”μ§€μ™€ 관계 없이 μœ μ§€λœλ‹€. a, b λ³€μˆ˜κ°€ f1에 μ˜ν•΄ 사라지지 λͺ»ν•˜λŠ” 상황이 μ•„λ‹ˆλ―€λ‘œ f1은 ν΄λ‘œμ €κ°€ μ•„λ‹ˆλ‹€.

var a = 10
var b = 20
function f1() {
  return a + b
}
f1() // 30

λ‹€μŒμ€ ν•¨μˆ˜ μ•ˆμ—μ„œ ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν•˜λŠ” 방식이닀. ν•˜μ§€λ§Œ f3, f4 λͺ¨λ‘ ν΄λ‘œμ €κ°€ μ•„λ‹ˆλ‹€.

  • f3은 f2 μ•ˆμ—μ„œ μƒμ„±λ˜μ—ˆλ‹€.

  • f3 λ°”λ‘œ μœ„μ—λŠ” a, bλΌλŠ” 지역 λ³€μˆ˜λ„ μžˆλ‹€. ν•˜μ§€λ§Œ f3 μ•ˆμ—μ„œ μ‹€μ œλ‘œ μ‚¬μš©ν•˜κ³  μžˆλŠ” λ³€μˆ˜λŠ” c, d이고, 두 λ³€μˆ˜ λͺ¨λ‘ f3μ—μ„œ μ •μ˜λ˜μ—ˆλ‹€.

  • μžμ‹ μ΄ 생성될 λ•Œμ˜ μŠ€μ½”ν”„κ°€ μ•Œκ³  μžˆλŠ” λ³€μˆ˜ a, bλŠ” μ‚¬μš©ν•˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ f3이 κΈ°μ–΅ν•΄μ•Ό ν•  λ³€μˆ˜λŠ” ν•˜λ‚˜λ„ μ—†λ‹€.

function f2() {
  var a = 10
  var b = 20
  function f3(c, d) {
    return c + d
  }
  return f3
}

var f4 = f2()
f4(5, 7) // 12

λ‹€μŒ μ˜ˆμ‹œμ—μ„œ ν΄λ‘œμ €κ°€ μžˆμ„κΉŒ? μ •ν™•ν•œ ν‘œν˜„μ€ 'μžˆμ—ˆλ‹€'이닀.

f4κ°€ μ‹€ν–‰λ˜κ³  a, bκ°€ ν• λ‹Ήλœ ν›„ f5κ°€ μ •μ˜λœλ‹€. 그리고 f5μ—μ„œλŠ” a, bκ°€ μ‚¬μš©λ˜κ³  μžˆμœΌλ―€λ‘œ f5λŠ” μžμ‹ μ΄ μƒμ„±λœ ν™˜κ²½μ„ κΈ°μ–΅ν•˜λŠ” ν΄λ‘œμ €κ°€ λœλ‹€.

ν•˜μ§€λ§Œ f4의 λ§ˆμ§€λ§‰ λΌμΈμ—μ„œ f5λ₯Ό μ‹€ν–‰ν•΄ λ¦¬ν„΄ν•˜κ³  μžˆλ‹€.

κ²°κ΅­ f5λ₯Ό μ°Έμ‘°ν•˜κ³  μžˆλŠ” 곳이 어디에도 μ—†μœΌλ―€λ‘œ f5λŠ” 사라지고, f5κ°€ 사라지면 a, b도 μ‚¬λΌμ§ˆ 수 μžˆκΈ°μ— ν΄λ‘œμ €λŠ” f4κ°€ μ‹€ν–‰λ˜λŠ” 사이에 생겼닀가 사라진닀.

function f4() {
  var a = 10
  var b = 20
  function f5() {
    return a + b
  }
  return f5()
}

λ‹€μŒ f7은 μ§„μ§œ ν΄λ‘œμ €μ΄λ‹€.

  • f7이 aλ₯Ό μ‚¬μš©ν•˜κΈ°μ— aλ₯Ό κΈ°μ–΅ν•΄μ•Ό ν•˜λ―€λ‘œ aλŠ” 사라지지 μ•ŠλŠ”λ‹€.

  • f7이 f8에 λ‹΄κ²Όλ‹€.

μ›λž˜λŒ€λ‘œλΌλ©΄ f6의 지역 λ³€μˆ˜λŠ” λͺ¨λ‘ 사라져야 ν•˜μ§€λ§Œ f6 싀행이 끝났어도 f7이 aλ₯Ό κΈ°μ–΅ν•˜λŠ” ν΄λ‘œμ €κ°€ λ˜μ—ˆκΈ° λ•Œλ¬Έμ— aλŠ” 사라지지 μ•ŠμœΌλ©°, f8을 μ‹€ν–‰ν•  λ•Œλ§ˆλ‹€ μƒˆλ‘œμš΄ λ³€μˆ˜μΈ b와 ν•¨κ»˜ μ‚¬μš©λ˜μ–΄ κ²°κ³Όλ₯Ό λ§Œλ“ λ‹€.

function f6() {
  var a = 10
  function f7(b) {
    return a + b
  }
  return f7
}

var f8 = f6()
f8(20) // 30
f8(10) // 20

λ‹€μŒ μ˜ˆμ‹œλŠ” 였λ₯˜κ°€ λ‚˜μ§€ μ•ŠλŠ”λ‹€.

  • ν΄λ‘œμ €λŠ” μžμ‹ μ΄ 생성될 'λ•Œ'의 μŠ€μ½”ν”„μ—μ„œ μ•Œ 수 μžˆμ—ˆλ˜ λ³€μˆ˜λ₯Ό κΈ°μ–΅ν•˜λŠ” ν•¨μˆ˜λΌκ³  ν–ˆλŠ”λ°, μ—¬κΈ°μ„œ 'λ•Œ'λŠ” 생각보닀 쑰금 κΈΈλ‹€. κ·Έκ±Έ λ³΄μ—¬μ£ΌλŠ” μ˜ˆμ‹œμ΄λ‹€.

    • 'λ•Œκ°€ 쑰금 κΈΈλ‹€'μ—μ„œ λ§ν•˜λŠ” 'λ•Œ'λŠ” ν•¨μˆ˜κ°€ 생성이 λ˜λŠ” λΌμΈμ΄λ‚˜ κ·Έ 이전을 μ˜λ―Έν•˜λŠ” 것이 μ•„λ‹ˆλΌ, κ·Έ μŠ€μ½”ν”„κ°€ μ‹€ν–‰λ˜κ³  μžˆλŠ” μ»¨ν…μŠ€νŠΈ 전체λ₯Ό λ§ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. (이 μ•ˆμ—μ„œ 비동기가 μΌμ–΄λ‚˜λ©΄ λ”μš± 길어지기도 ν•  것이닀.)

  • 'μŠ€μ½”ν”„μ—μ„œ μ•Œ 수 μžˆμ—ˆλ˜'이라고 ν•˜λŠ” 뢀뢄도 이 μ˜ˆμ œμ—μ„œ μ„€λͺ…λœλ‹€.

    • μ—¬κΈ°μ„œ λ§ν•˜λŠ” κ·Έ μŠ€μ½”ν”„λŠ” ν•¨μˆ˜μΌ μˆ˜λ„ μžˆλ‹€. 만일 ν•¨μˆ˜λΌλ©΄ ν•¨μˆ˜κ°€ 싀행될 λ•Œλ§ˆλ‹€ κ·Έ μŠ€μ½”ν”„μ˜ ν™˜κ²½μ€ μƒˆλ‘œ λ§Œλ“€μ–΄μ§„λ‹€.

    • ν΄λ‘œμ € μžμ‹ μ΄ 생성될 'λ•Œμ˜ μŠ€μ½”ν”„μ—μ„œ μ•Œ 수 μžˆμ—ˆλ˜'의 μ˜λ―ΈλŠ” 'ν΄λ‘œμ €κ°€ μƒμ„±λ˜κ³  μžˆλŠ” 이번 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ μ•Œ 수 μžˆμ—ˆλ˜'μ΄λΌλŠ” μ˜λ―Έλ‹€.

f10μ—λŠ” 읡λͺ… ν•¨μˆ˜λ₯Ό λ‹΄μ•˜λ‹€. (λ¬Όλ‘  function f10(c) { ... }둜 해도 정상 λ™μž‘ν•œλ‹€.)

f10이 μƒμ„±λ˜κΈ° 이전에 bλŠ” 20으둜 μ΄ˆκΈ°ν™” λ˜μ§€ μ•Šμ•˜λ‹€. ν΄λ‘œμ €λŠ” μžμ‹ μ΄ μƒμ„±λ˜λŠ” μŠ€μ½”ν”„μ˜ λͺ¨λ“  라인, μ–΄λŠ κ³³μ—μ„œ μ„ μ–Έλœ λ³€μˆ˜λ“ μ§€ μ°Έμ‘°ν•˜κ³  κΈ°μ–΅ν•  수 μžˆλ‹€. 그리고 그것은 λ³€μˆ˜μ΄κΈ°μ— ν΄λ‘œμ € 생성 이후 μ–Έμ œλ“  값이 변경될 수 μžˆλ‹€.

function f9() {
  var a = 10
  var f10 = function(c) {
    return a + b + c
  }
  var b = 20
  return f10
}

var f11 = f9()
f11(30) // 60

λ‹€μ‹œ ν΄λ‘œμ €λ₯Ό ν’€μ–΄μ„œ μ •μ˜ν•΄ 보자.

ν΄λ‘œμ €λŠ” μžμ‹ μ΄ μƒμ„±λ˜λŠ” μŠ€μ½”ν”„μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ λ§Œλ“€μ–΄μ‘Œκ±°λ‚˜ μ•Œ 수 μžˆμ—ˆλ˜ λ³€μˆ˜ 쀑 μ–Έμ  κ°€ μžμ‹ μ΄ 싀행될 λ•Œ μ‚¬μš©ν•  λ³€μˆ˜λ“€λ§Œ κΈ°μ–΅ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€. ν΄λ‘œμ €κ°€ κΈ°μ–΅ν•˜λŠ” λ³€μˆ˜μ˜ 값은 μ–Έμ œλ“ μ§€ λ‚¨μ΄λ‚˜ μžμ‹ μ— μ˜ν•΄ 변경될 수 μžˆλ‹€.

μ‹€μš© 사둀

ν΄λ‘œμ €μ˜ κ°•λ ₯ν•¨μ΄λ‚˜ μ‹€μš©μ„±μ€ 은닉에 μžˆμ§€ μ•Šλ‹€. 은닉은 의미 μžˆλŠ” 기술이자 κ°œλ…μ΄μ§€λ§Œ, 은닉 μžμ²΄κ°€ ν΄λ‘œμ €μ˜ λͺ©μ μ€ μ•„λ‹ˆλ‹€.

ν΄λ‘œμ €κ°€ κ°•λ ₯ν•˜κ³  μ‹€μš©μ μΈ 상황은 λ”°λ‘œ μžˆλ‹€.

  • 이전 상황을 λ‚˜μ€‘μ— 일어날 상황과 이어 λ‚˜κ°ˆ λ•Œ

  • ν•¨μˆ˜λ‘œ ν•¨μˆ˜λ₯Ό λ§Œλ“€κ±°λ‚˜ λΆ€λΆ„ μ μš©μ„ ν•  λ•Œ

이전 상황을 λ‚˜μ€‘μ— 일어날 상황과 이어 λ‚˜κ°ˆ λ•Œ

  • 이벀트 λ¦¬μŠ€λ„ˆλ‘œ ν•¨μˆ˜λ₯Ό λ„˜κΈ°κΈ° 이전에 μ•Œ 수 μžˆμ—ˆλ˜ 상황듀을 λ³€μˆ˜μ— λ‹΄μ•„ ν΄λ‘œμ €λ‘œ λ§Œλ“€μ–΄ κΈ°μ–΅ν•΄ 두면, μ΄λ²€νŠΈκ°€ λ°œμƒλ˜μ–΄ ν΄λ‘œμ €κ°€ μ‹€ν–‰λ˜μ—ˆμ„ λ•Œ κΈ°μ–΅ν•΄ λ‘μ—ˆλ˜ λ³€μˆ˜λ“€λ‘œ 이전 상황듀을 μ΄μ–΄κ°ˆ 수 μžˆλ‹€.

  • 콜백 νŒ¨ν„΄μ—μ„œλ„ λ§ˆμ°¬κ°€μ§€λ‘œ 콜백으둜 ν•¨μˆ˜λ₯Ό λ„˜κΈ°κΈ° 이전 상황을 ν΄λ‘œμ €λ‘œ λ§Œλ“€μ–΄ κΈ°μ–΅ν•΄ λ‘λŠ” μ‹μœΌλ‘œ μ΄μ „μ˜ 상황을 이어 갈 수 μžˆλ‹€.

정리

ν΄λ‘œμ €λŠ”...

  • μžμ‹ μ΄ 생성될 "λ•Œ"의 μŠ€μ½”ν”„μ—μ„œ μ•Œ 수 μžˆμ—ˆλ˜ λ³€μˆ˜λ₯Ό κΈ°μ–΅ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€.

  • 사싀 μ‚¬μš©ν•˜κΈ° λ³„λ‘œ 어렡지 μ•Šλ‹€.

  • μ ˆμ°¨μ§€ν–₯, 객체지ν–₯, ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° λͺ¨λ‘λ₯Ό μ§€νƒ±ν•˜λŠ” 맀우 μ€‘μš”ν•œ κΈ°λŠ₯이자 κ°œλ…μ΄λ‹€.

  • μ„œλ‘œ λΆ„λ¦¬λœ μ»¨ν…μŠ€νŠΈλ‚˜ 객체λ₯Ό μ‰¬μš΄ κ°œλ…μœΌλ‘œ 이어쀀닀.

  • 많이 μ‚¬μš©ν•˜μž. λ¬Έμ œκ°€ μΌμ–΄λ‚˜λ©΄ κ·Έ λ•Œ ν•΄κ²°ν•˜μž. (μ›¬λ§Œν•΄μ„œλŠ” 문제λ₯Ό μΌμœΌν‚€μ§€ μ•Šμ„ 것이닀.)

REF

Last updated

Was this helpful?