ν΄λ‘μ λ **ν¨μμ κ·Έ ν¨μκ° μ μΈλ λΉμμ λ μ컬 νκ²½(Lexical Environment)**μ μ‘°ν©μ΄λ€. ν¨μκ° μ€ν 컨ν μ€νΈ λ°μμλ, κ·Έ λΉμ μ€μ½νμ μ κ·Όν μ μκ² λ§λ λ€.
function outer() {
let secret = 'secret';
return function inner() {
console.log(secret); // μ΄λ secretμ μ°Έμ‘°ν¨
};
}
inner() ν¨μλ outer()κ° μ΄λ―Έ μ’
λ£λ μ΄νμλ secretμ μ κ·Ό κ°λ₯.[[Environment]]κ° μ¬μ ν secretμ μ°Έμ‘°νκ³ μκΈ° λλ¬Έ.μλ°μ€ν¬λ¦½νΈλ μ€ν μμ λ§λ€ μ€ν 컨ν μ€νΈλ₯Ό μμ±νλλ°, ν΄λ‘μ λ κ·Έ μ€ν 컨ν μ€νΈκ° μ¬λΌμ Έλ **νκ²½ λ μ½λ(Environment Record)**κ° μ΄μμκ² λ§λ λ€.
β κ²°λ‘ : ν΄λ‘μ λ GCμ μν΄ μ κ±°λμ§ μλλ‘ νκ²½μ μ°Έμ‘° μνλ‘ μ μ§νλ€.
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
function multiply(a) {
return function (b) {
return a * b;
};
}
const double = multiply(2);
console.log(double(5)); // 10