πŸŽ“ 1. ν΄λ‘œμ €λž€?

ν΄λ‘œμ €λŠ” **ν•¨μˆ˜μ™€ κ·Έ ν•¨μˆ˜κ°€ 선언될 λ‹Ήμ‹œμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½(Lexical Environment)**의 쑰합이닀. ν•¨μˆ˜κ°€ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ λ°–μ—μ„œλ„, κ·Έ λ‹Ήμ‹œ μŠ€μ½”ν”„μ— μ ‘κ·Όν•  수 있게 λ§Œλ“ λ‹€.

🧬 λ‚΄λΆ€ ꡬ쑰 (ν•¨μˆ˜ κ°μ²΄λŠ” ν™˜κ²½μ„ κΈ°μ–΅ν•œλ‹€)

function outer() {
  let secret = 'secret';

  return function inner() {
    console.log(secret); // μ΄λ•Œ secret을 참쑰함
  };
}

πŸ”„ 2. μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ™€μ˜ 관계

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ‹€ν–‰ μ‹œμ λ§ˆλ‹€ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•˜λŠ”λ°, ν΄λ‘œμ €λŠ” κ·Έ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ 사라져도 **ν™˜κ²½ λ ˆμ½”λ“œ(Environment Record)**κ°€ μ‚΄μ•„μžˆκ²Œ λ§Œλ“ λ‹€.

βœ… κ²°λ‘ : ν΄λ‘œμ €λŠ” GC에 μ˜ν•΄ μ œκ±°λ˜μ§€ μ•Šλ„λ‘ ν™˜κ²½μ„ μ°Έμ‘° μƒνƒœλ‘œ μœ μ§€ν•œλ‹€.


πŸ” 3. ν΄λ‘œμ €μ˜ λŒ€ν‘œμ μΈ ν™œμš© 예

1) 데이터 은닉 (Encapsulation)

function createCounter() {
  let count = 0;

  return {
    increment() {
      count++;
      return count;
    },
    decrement() {
      count--;
      return count;
    },
  };
}

const counter = createCounter();
console.log(counter.increment()); // 1
console.log(counter.increment()); // 2

2) λΆ€λΆ„ 적용 ν•¨μˆ˜ (Partial Application)

function multiply(a) {
  return function (b) {
    return a * b;
  };
}

const double = multiply(2);
console.log(double(5)); // 10