
ν΄λ‘μ λ ν¨μμ κ·Έ ν¨μκ° μ μΈλ λ μ컬 νκ²½μ μ‘°ν©
ν¨μ λ΄λΆμμ μΈλΆ ν¨μμ λ³μμ μ κ·Όν μ μλλ‘ λ§λλ κΈ°λ₯
μλ°μ€ν¬λ¦½νΈμμλ ν¨μκ° νκ°λ λμ μμ μ€μ½ν 체μΈλ μ°Έμ‘°ν¨. (μΈλΆ λ μ컬 νκ²½ μ°Έμ‘°μ λν κ²°μ )
λ μ컬(Lexical) μ€μ½νλ μ μ μ€μ½νλΌκ³ λ λΆλ¦¬λ©°, ν¨μκ° μ΄λμ μ μλμλμ§μ λ°λΌ μμ μ€μ½νκ° κ²°μ λλ λ°©μ.
μ€νλλ μμΉκ° μλλΌ μ μλ μμΉκ° κΈ°μ€μ΄λΌλ μ μ΄ ν΅μ¬.
λν, ν¨μ κ°μ²΄ λ΄λΆ μ¬λ‘― [[Environment]]μ μ μ₯ν¨.
ν¨μ μμ μ΄ μ μλ νκ²½μΈ μμ μ€μ½νμ μ°Έμ‘°λ₯Ό μ μ₯
μ¦, ν¨μκ° νκ°λ λΉμμ μ€ν μ€μΈ μ€ν 컨ν
μ€νΈμ λ μ컬 νκ²½μ κ°λ₯΄ν΄.
function outer() {
const x = 10;
const inner = function() {
console.log(x); // μΈλΆ ν¨μμ λ³μ xμ μ κ·Ό
};
return inner;
}
const closureFn = outer();
closureFn(); // κ²°κ³Ό: 10
μ΄ μμ μμ outer()λ λ΄λΆ ν¨μ innerλ₯Ό λ°ννκ³ μ’
λ£λμ§λ§, innerλ μ¬μ ν xλ₯Ό κΈ°μ΅νκ³ μμ.
μ΄κ² ν΄λ‘μ μ΄λ€.
μ€μν κ°λ
μ€μ²© ν¨μκ° μΈλΆ ν¨μλ³΄λ€ μ€λ μμ‘΄νλ©΄μ μΈλΆ ν¨μμ μ§μ λ³μλ₯Ό μ°Έμ‘°νλ©΄ ν΄λ‘μ κ° λ§λ€μ΄μ§κ³ , μΈλΆ ν¨μμ λ³μλ€μ κ³μ μ°Έμ‘°ν μ μκ² λ¨. (κ° λ³κ²½λ κ°λ₯)
μΈλΆ ν¨μμ μ€μ½νλ₯Ό μ°Έμ‘°νμ§ μμ κ²½μ°μλ λͺ¨λ λΈλΌμ°μ μ μ΅μ ν κΈ°λ₯μ μν΄ ν΄λ‘μ λ‘ νλ¨λμ§ μμ. (λ©λͺ¨λ¦¬ ν¨μ¨ κ΅Ώ)
μΈλΆ ν¨μκ° μ’ λ£λμλλΌλ, λ΄λΆ ν¨μκ° κ·Έ νκ²½μ μ°Έμ‘°νκ³ μλ€λ©΄ κ·Έ λ μ컬 νκ²½μ GC(Garbage Collection)μ λμμ΄ λμ§ μμ.
μ¦, ν΄λ‘μ λ λ©λͺ¨λ¦¬λ₯Ό μ μ ν μ± μ μ§λ μ μμ
λͺ¨λ μλ°μ€ν¬λ¦½νΈ μμ§(V8 λ±)μ μ΅μ νλ₯Ό μνν΄ μ€μ λ‘ μ¬μ©λμ§ μλ μμ μ€μ½νμ μλ³μλ κΈ°μ΅νμ§ μμμ λ©λͺ¨λ¦¬ λλΉλ₯Ό μ€μΌ μ μμ.
ν΄λ‘μ κ° μ±λ¦½λλ €λ©΄ μλ λ μ‘°κ±΄μ΄ μΆ©μ‘±λμ΄μΌ ν¨
λ΄λΆ ν¨μκ° μ¬μ©νλ λ³μ μ€, μμ μ μ€μ½νμ μ‘΄μ¬νμ§ μλ λ³μλ₯Ό μμ λ³μλΌκ³ λΆλ₯Έλ€. ν΄λ‘μ λ μ΄λ° μμ λ³μλ€μ μμ μ΄ μ μΈλ λΉμμ λ μ컬 νκ²½μ μ μ₯νμ¬ κ³μ μ¬μ©ν μ μλλ‘ ν΄μ£Όλ κ²
ν΄λ‘μ λΌλ μ΄λ¦μ μλ―Έ λν ν¨μκ° μμ λ³μμ μν΄ λ«νμλ€λ μλ―Έ
μμ λ³μλ₯Ό μ¬μ©ν μ μκ² ν΄μ£Όλλ° μ€νλ μλμ§
ν΄λ‘μ λ μνλ₯Ό μλνκ±°λ νΉμ ν¨μμμλ§ μ κ·Ό κ°λ₯νκ² λ§λ€κ³ μΆμ λ μ μ©ν¨
function counter() {
let count = 0;
return function() {
count++;
console.log(count);
};
}
const myCounter = counter();
myCounter(); // 1
myCounter(); // 2
μ¬κΈ°μ countλ μΈλΆμμ μ κ·Όν μ μκ³ myCounterλ₯Ό ν΅ν΄μλ§ μ κ·Ό κ°λ₯νλ€.
μ΄λ° ꡬ쑰λ μ 보 μλμ΄λ λͺ¨λ ν¨ν΄ ꡬνμ νμν¨
ν¨μν νλ‘κ·Έλλ°μμλ λΆλ³μ±μ μ€μμνλ€.
μΈλΆ μνλ₯Ό λ³κ²½νμ§ μλ κ²μ΄ ν΅μ¬μΈλ°, ν΄λ‘μ λ₯Ό ν΅ν΄ λΆμ ν¨κ³Ό(Side Effects)λ₯Ό μ€μΌ μ μλ€.
ν΄λ‘μ λ₯Ό μ΄μ©νλ©΄ μνλ₯Ό ν¨μ λ΄λΆλ‘ μ¨κΈΈ μ μμ΄ μ€λ₯ κ°λ₯μ±μ΄ μ€κ³ μ μ§λ³΄μλ μ¬μμ Έ μμ£Ό μ¬μ©λλ ν¨ν΄μ΄λ€.
| νλͺ© | μ€λͺ |
|---|---|
| μ μ | ν¨μμ ν¨μκ° μ μΈλ λ μ컬 νκ²½μ μ‘°ν© |
| λͺ©μ | μΈλΆ ν¨μ λ³μ μ°Έμ‘°, μν μ μ§ |
| 쑰건 | μ€μ²© ν¨μκ° μΈλΆ ν¨μλ³΄λ€ μ€λ μμ‘΄ & μμ λ³μ μ°Έμ‘° |
| νμ© | μν μλ, μΊ‘μν, λͺ¨λ ν¨ν΄ λ± |
| μ μμ¬ν | λ©λͺ¨λ¦¬ λμ κ°λ₯μ±, κ³Όλν μ°Έμ‘° μ§μ |
ν΄λ‘μ λ μΈμ λ§λ€μ΄μ§λ
ν¨μκ° μ μλ λ ν΄λ‘μ κ° λ§λ€μ΄μ§.
μ€ν μμ μ΄ μλλΌ μ μΈ μμ μ΄λΌλ κ² μ€μνλ€.
ν΄λ‘μ λ λ©λͺ¨λ¦¬μ μΌλ§λ μ€λ λ¨λ
μ°Έμ‘°κ° κ³μλλ ν GCμ μν΄ ν΄μ λμ§ μκ³ μ μ§λ¨.
λͺ¨λ μ€μ²© ν¨μκ° ν΄λ‘μ μΈμ§
μλλ€. μμ μ€μ½νμ λ³μλ₯Ό μ°Έμ‘°νμ§ μλλ€λ©΄ ν΄λ‘μ κ° μλλ€.
ν΄λ‘μ λ μ λ©λͺ¨λ¦¬ λμλ λλΉλ₯Ό μ λ°νλμ§
μ¬μ©νμ§ μλ λ μ컬 νκ²½λ κ³μ μ μ§λκΈ° λλ¬Έ
λͺ¨λ λΈλΌμ°μ μ μ΅μ νλ₯Ό ν΅ν΄ ν΄κ²° κ°λ₯νμ§λ§, λ€λ₯Έ νκ²½μ΄λ ꡬν λΈλΌμ°μ μμ ν΄λ‘μ λ₯Ό μ¬μ©ν΄μΌνλ€λ©΄ μ μν΄μΌν λΆλΆμ΄λ€.
ν΄λ‘μ λ₯Ό νμ©ν μ€λ¬΄ μμ
- Vue, Reactμ
setupν¨μ λ΄λΆ μν- JavaScript λͺ¨λ ꡬν
- private λ³μ ꡬν λ±
JSμμ ν΄λ‘μ μμ΄ λΉμ·ν κΈ°λ₯μ ꡬνν μ μλμ§
ES6μ ν΄λμ€λ Symbol λ±μ ν΅ν΄ μ μ¬ν ꡬ쑰λ₯Ό ꡬνν μλ μμ§λ§, ν΄λ‘μ λ§νΌ μ§κ΄μ μ΄κ±°λ λͺ μμ μ΄μ§ μμ.
ν΄λ‘μ λ μλ°μ€ν¬λ¦½νΈμμ κ°μ₯ κ°λ ₯νλ©΄μλ μ€ν΄λ°κΈ° μ¬μ΄ κ°λ
μ΄λ€.
μ λλ‘ μ΄ν΄νκ³ λλ©΄ μν κ΄λ¦¬, μ 보 μλ, λͺ¨λν λ± μ¬λ¬ μν©μμ μμ£Ό μ μ©νκ² νμ© κ°λ₯νλ€.
π μ°Έκ³ λ§ν¬