ν΄λ‘μ (Closure)λ ν¨μκ° λμ μΌλ‘ μμ±λ λ³μμ μ κ·Όν μ μλ λ°©λ²μ μ 곡ν©λλ€. ν΄λ‘μ λ ν¨μ λ΄λΆμ μ μΈλ λ³μλ₯Ό ν¨μ μΈλΆμμλ μ¬μ©ν μ μλλ‘ ν΄μ€λλ€.
ν΄λ‘μ λ λ΄λΆ ν¨μκ° μΈλΆ ν¨μμ λ³μλ₯Ό μ°Έμ‘°ν λ λ°μν©λλ€. μ΄λ λ΄λΆ ν¨μκ° μΈλΆ ν¨μλ³΄λ€ λ μ€λ μ μ§λ κ²½μ°, λ΄λΆ ν¨μλ μΈλΆ ν¨μμ λ³μλ₯Ό κ³μ μ°Έμ‘°ν μ μμ΅λλ€. μ΄λ κ² μΈλΆ ν¨μμ λ³μλ₯Ό κ³μ μ°Έμ‘°ν μ μλ ν¨μλ₯Ό ν΄λ‘μ λΌκ³ ν©λλ€.
const x = 1;
// (1)
function outer() {
const x = 10;
const inner = function() { console.log(x);} // (2)
return inner;
}
// outer ν¨μλ₯Ό νΈμΆνλ©΄ μ€μ²© ν¨μ innerλ₯Ό λ°νν©λλ€.
// κ·Έλ¦¬κ³ outer ν¨μμ μ€ν 컨ν
μ€νΈλ μ€ν 컨ν
μ€νΈ μ€νμμ νλμ΄ μ κ±°λ©λλ€.
const innerFunc = outer(); // (3)
innerFunc() // (4) 10
-
outer ν¨μλ₯Ό νΈμΆνλ©΄ outer ν¨μλ μ€μ²© ν¨μ innerλ₯Ό λ°ννκ³ μλͺ μ£ΌκΈ°λ₯Ό λ§κ°ν©λλ€. μ¦, outer ν¨μμ μ€νμ΄ μ’ λ£λλ©΄ outer ν¨μμ μ€ν 컨ν μ€νΈλ μ€ν 컨ν μ€νΈ μ€νμμ μ κ±°λ©λλ€.
-
outer ν¨μμ μ§μ λ³μ xμ λ³μ κ° 10μ μ μ₯νκ³ μλ outer ν¨μμ μ€ν 컨ν μ€νΈκ° μ κ±°λμμΌλ―λ‘ outer ν¨μμ μ§μ λ³μ x λν μλͺ μ£ΌκΈ°λ₯Ό λ§κ°ν©λλ€. λ°λΌμ outer ν¨μμ μ§μ λ³μ xλ λλ μ ν¨νμ§ μκ² λμ΄ x λ³μμ μ κ·Όν μ μλ λ°©λ²μ λ¬λ¦¬ μμ΄ λ³΄μ λλ€.
-
νμ§λ§ μ μ½λμ μ€νκ²°κ³Ό (4) λ outer ν¨μμ μ§μ λ³μ xμ κ°μΈ 10μ λλ€.
-
μ΄μ²λΌ μΈλΆ ν¨μλ³΄λ€ μ€μ²© ν¨μκ° λ μ€λ μ μ§λλ κ²½μ° μ€μ²© ν¨μλ μ΄λ―Έ μλͺ μ£ΌκΈ°κ° μ’ λ£ν μΈλΆ ν¨μμ λ³μλ₯Ό μ°Έμ‘°ν μ μμ΅λλ€. μ΄λ¬ν μ€μ²© ν¨μλ₯Ό ν΄λ‘μ (closure)λΌκ³ λΆλ¦ λλ€.
μ°Έκ³ λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive ~393p