ν΄λ‘μ (Closure) λ ν¨μν νλ‘κ·Έλλ° μΈμ΄μμ μ¬μ©λλ μ€μν νΉμ±μΌλ‘, JS λΏλ§ μλλΌ νμ€μΌμ΄λ μ€μΉΌλΌ λ±μ μΈμ΄μλ λ±μ₯νλ€. MDN μ΄ μ μνλ ν΄λ‘μ λ λ€μκ³Ό κ°λ€.
ν΄λ‘μ λ ν¨μμ ν¨μκ° μ μΈλ μ΄νμ (λ μ컬) νκ²½(Lexical environment)μ μ‘°ν©μ΄λ€.
λ μ컬 νκ²½μ λν λ Όμλ μ΄μ κΈμμ κ°λ΅ν νμΌλ, ν΄λ‘μ μ λν μ΄ν΄λ₯Ό λκΈ° μν΄μ κΉμ΄ μμμΌ νλ κ°λ μ΄λ―λ‘ λ μ컬 νκ²½μ κ°λ λΆν° μμ보μ.
β¨ λ μ컬 νκ²½κ³Ό [[Environment]]
π λ μ컬 νκ²½
λ μ컬 νκ²½μ λ μ컬 μ€μ½νλ₯Ό κ°μ§κ³ μλ€. λ μ컬 μ€μ½νλ ν¨μμ μ€μ½νμ ν¨μκ° μ μλ μμΉμ λ°λΌ κ²°μ λλ μμ μ€μ½νμ΄λ€. JS λ λ μ컬 νκ²½μ λ°λ₯΄κΈ° λλ¬Έμ, ν¨μμ νΈμΆ μμΉκ° μλ μ μν μμΉμ μν΄ μμ κ°μ²΄λ₯Ό μ°Έμ‘°νλ€.
λ μ컬 νκ²½μ "μΈλΆ λ μ컬 νκ²½μ λν μ°Έμ‘° (Outer Lexical Environment Reference)" μ μ°Έμ‘°κ°μ μ μ₯ν¨μΌλ‘μ¨ μμ λ μ컬 νκ²½κ³Ό μ°κ²°λλλ°, μ΄ λ μ μ₯λλ μ°Έμ‘°κ°μ΄ λ°λ‘ μμ μ€μ½νμ΄λ€.
π ν¨μ κ°μ²΄μ [[Environment]]
λͺ¨λ ν¨μλ [[Environment]]λΌ λΆλ¦¬λ μ¨κΉ νλ‘νΌν°λ₯Ό κ°λλ°, μ¬κΈ°μ ν¨μκ° λ§λ€μ΄μ§ κ³³μ λ μ컬 νκ²½μ λν μ°Έμ‘°κ° μ μ₯λλ€. ν¨μλ ν¨μμ λ΄λΆ μ¬λ‘―μΈ [[Environment]] μ μ΄μ©νμ¬ μμ μ΄ μ μλ νκ²½μ κΈ°μ΅νλ€. ν¨μ μ μκ° νκ°λμ΄ ν¨μ κ°μ²΄λ₯Ό μμ±νλ μμ μ ν¨μκ° μ μλ νκ²½ (μμ μ€μ½ν) μ μ½λκ° νκ°λκ³ μλ μμ μ΄λ―λ‘, μμ μ€ν 컨ν μ€νΈκ° μ°Έμ‘°κ°μΌλ‘ μ μ₯λλ€.
μμ : ν¨μ νΈμΆ μμΉμ μμ μ€μ½νλ κ΄κ³ μλ€.
const x = 1;
function foo() {
const x = 10;
bar();
}
function bar() {
console.log(x);
}
foo(); // 1
bar(); // 1
β¨ ν΄λ‘μ
μμ ν΄λ‘μ λ "ν¨μμ ν¨μκ° μ μΈλ μ΄νμ (λ μ컬) νκ²½(Lexical environment)μ μ‘°ν©" μ΄λΌκ³ μκΈ°νμλ€. μ΄λ₯Ό λ¬λ¦¬ λ§νλ©΄, ν΄λ‘μ λ μΈλΆ ν¨μλ³΄λ€ λ μ€λ μ μ§λμ΄, μ΄λ―Έ μλͺ μ£ΌκΈ°κ° μ’ λ£ν μΈλΆ ν¨μμ λ³μλ₯Ό μ°Έμ‘°ν μ μλ μ€μ²© ν¨μμ΄λ€.
λ€μ μμλ₯Ό ν΅ν΄ ꡬ체μ μΈ λ΄μ©μ μμλ³΄κ² λ€.
const x = 1;
function outer() {
const x = 10;
const inner = () => x;
return inner;
}
const innerFunc = outer();
innerFunc(); // 10
μ μμ μμ μΈλΆ ν¨μλ outer, μ€μ²© ν¨μλ inner μ΄λ€. outer μ μλͺ μ£ΌκΈ°κ° μ’ λ£νλ μκ°μ outer ν¨μμ μ€νμ΄ μ’ λ£λ μκ°μ΄λ€. (μ½ μ€νμμ μ΄λ―Έ μ κ±°λ¨) μ΄λ, outer λ΄λΆμ μ μΈλμλ μλ³μ x μ κ°μΈ 10 μμ μλͺ μ£ΌκΈ°κ° λ§κ°λμ΄, ν΄λΉ λ³μμ μ κ·Όν μ μλ λ°©λ²μ μμ κ²λ€. νμ§λ§ μ΄λ₯Ό κ°λ₯νκ² ν΄ μ£Όλ κ²μ΄ ν΄λ‘μ μ΄λ€.
inner ν¨μλ μ μλ μκ° μμ μ€μ½νλ₯Ό [[Environment]] νλ‘νΌν°μ μ μ₯νμμΌλ©°, inner ν¨μκ° μ‘΄μ¬νλ ν μ΄ κ°μ μ μ§λλ€. λΉλ‘ outer ν¨μλ μ’ λ£λμ΄ μ½ μ€νμμ λΉ μ Έλκ°μ΄λ, inner ν¨μκ° μ΄λ₯Ό μ°Έμ‘°νκ³ μκΈ° λλ¬Έμ κ°λΉμ§ 컬λ μ μ λμμ΄ λμ§ μμΌλ©°, λ©λͺ¨λ¦¬ 곡κ°μμ ν΄μ λμ§ μμλ€. μ΄μ²λΌ μ€μ²© ν¨μμ λ μ컬 νκ²½μ΄ μ°Έμ‘°νλ μμ ν¨μμ λ μ컬 νκ²½λ³΄λ€ λ μ€λ μ΄μλ¨μλ, λ°μΈλ©μ΄ λμ΄ μκΈ° λλ¬Έμ κ³μ κ°μ κ²μν΄ μ¬ μ μλ κ²μ΄λ€.
μμ inner ν¨μλ ν΄λ‘μ λΌκ³ ν μ μμ§λ§, μλμ κ°μ΄ μμ μ€μ½νλ₯Ό μ°Έμ‘°νμ§ μλ inner ν¨μλ ν΄λ‘μ λΌκ³ ν μ μλ€.
function outer() {
const x = 1;
function inner() {
const z = 2;
return z;
}
return inner;
}
outer();
λν, μΈλΆ ν¨μλ³΄λ€ μμ μ£ΌκΈ°κ° μ§§μ μ€μ²© ν¨μ μμ ν΄λ‘μ μ λ³Έμ§μ μ΄κΈλλ―λ‘, ν΄λ‘μ λΌκ³ λΆλ₯΄μ§ μλ κ²μ΄ μΌλ°μ μ΄λ€.
function outer() {
const x = 1;
function inner() {
console.log(x);
}
inner();
}
outer();
π‘ ν΄λ‘μ λ μ£Όλ‘ μ 보λ₯Ό μμ νκ² λ³κ²½νκ±°λ μ μ§νκ³ μ ν λ μ¬μ©λλ€. μ΄λ μ 보λ₯Ό μλνλ OOP μ μμμΈ "μΊ‘μν" μλ μ°κ΄μ±μ΄ λλ€.
β¨ μμ½
- λ μ컬 νκ²½μ μλ³μμ μλ³μμ λ°μΈλ©λ κ°, κ·Έλ¦¬κ³ μμ μ€μ½νμ λν μ°Έμ‘°λ₯Ό κΈ°λ‘νλ€.
- λ μ컬 μ€μ½νλ ν¨μμ μ€μ½νμ ν¨μκ° μ μλ μμΉμ λ°λΌ κ²°μ λλ μμ μ€μ½νμ΄λ€.
- λͺ¨λ ν¨μλ νλ‘νΌν°μΈ [[Environment]] μ μ΄μ©νμ¬ μμ μ΄ μ μλ νκ²½κ³Ό λ μ컬 μ€μ½νλ₯Ό κΈ°μ΅νλ€.
- ν΄λ‘μ λ ν¨μμ ν¨μμ λ μ컬 νκ²½μ μ‘°ν©μ΄λ€. κ°λ¨ν λ§νλ©΄ ν΄λ‘μ λ μμ μ€μ½νλ₯Ό μ°Έμ‘°νλ ν¨μμ΄λ€.
β¨ μ°Έκ³ μλ£
- λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive (μν€λΆμ€)
- λ³μ μ ν¨λ²μμ ν΄λ‘μ
'π» DEV > Javascript & NodeJS' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Javascript] Generator (μ λ€λ μ΄ν°) (0) | 2021.10.26 |
---|---|
[Javascript] Iterable (μ΄ν°λ¬λΈ) (0) | 2021.10.13 |
[Javascript] μ€ν 컨ν μ€νΈ (Execution Context) μ μμ€μ½λ (0) | 2021.09.28 |
[NodeJS] Node μ this λ? (+ νμ΄ν ν¨μμ this) (2) | 2021.09.10 |
[Javascript] Javascript μ this λ? (0) | 2021.09.07 |
λκΈ