Closure

  • λ³€μˆ˜μ˜ μœ νš¨λ²”μœ„λ₯Ό μ˜λ―Έν•œλ‹€

μ „μ—­ μŠ€μ½”ν”„, 지역 μŠ€μ½”ν”„

  • λ³€μˆ˜μ™€ 같이 μ „μ—­ μŠ€μ½”ν”„, 지역 μŠ€μ½”ν”„λ‘œ 크게 λ‚˜λˆŒ 수 μžˆλ‹€
var μ „μ—­ = '1';

function foo() {
  var 지역 = '1';
}

ν•¨μˆ˜ μŠ€μ½”ν”„, 블둝 μŠ€μ½”ν”„

  • μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 일반적으둜 ν•¨μˆ˜ μŠ€μ½”ν”„λ₯Ό κ°–λŠ”λ‹€ (varλ₯Ό μ‚¬μš©ν•œ 경우)
function foo() {
  if (true) {
    var a = 1;
  }
  console.log(a); // 1
}
  • let을 μ‚¬μš©ν•˜λ©΄ 블둝 μŠ€μ½”ν”„λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€
function foo() {
  if (true) {
    let a = 1;
  }
  console.log(a); // undefined
}

λ ‰μ‹œμ»¬ μŠ€μ½”ν”„

  • λ ‰μ‹œμ»¬/정적 μŠ€μ½”ν”„μ—μ„œλŠ” ν•¨μˆ˜ μŠ€μ½”ν”„μ˜ μƒμœ„ μŠ€μ½”ν”„λ₯Ό ν•¨μˆ˜κ°€ μ„ μ–Έλœ μœ„μΉ˜μ˜ μŠ€μ½”ν”„κ°€ μƒμœ„ μŠ€μ½”ν”„κ°€ λœλ‹€
  • 동적 μŠ€μ½”ν”„μ—μ„œλŠ” ν•¨μˆ˜κ°€ 호좜된 μœ„μΉ˜μ˜ μŠ€μ½”ν”„κ°€ μƒμœ„ μŠ€μ½”ν”„κ°€ λœλ‹€.
  • μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λ ‰μ‹œμ»¬ μŠ€μ½”ν”„λ₯Ό λ”°λ₯Έλ‹€
function foo_1() {
  var a = 1;

  function foo_2() {
    var a = 2;
    foo_3();
  }

  function foo_3() {
    console.log(a); // 1
  }
}

암묡적 μ „μ—­ λ³€μˆ˜(?)

  • μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” λ³€μˆ˜ μ„ μ–Έ 없이 identifierλ₯Ό μ‚¬μš©ν•΄ 값을 ν• λ‹Ήν•˜λ©΄ window 객체의 ν”„λ‘œνΌν‹°μ— ν•΄λ‹Ή identifierλ₯Ό 포함해 μ „μ—­ 객체처럼 μ‚¬μš©ν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ μ‹€μ œ μ „μ—­ λ³€μˆ˜λŠ” μ•„λ‹ˆλΌ hoisting이 λ°œμƒν•˜μ§€ μ•Šκ³  delete둜 κ°μ²΄μ—μ„œ μ‚­μ œκ°€ κ°€λŠ₯ν•˜λ‹€.
function foo() {
  y = 10;
}

foo();

// window.y = 10 둜 μ €μž₯λ˜μ–΄ 있음

끝

😊