μλ°μ€νΈλ¦½νΈμ λμμ리λ₯Ό λ΄κ³ μλ€. μμ€μ½λλ₯Ό μ€ννλλ° νμν νκ²½μ μ 곡νκ³ , μ€νκ²°κ³Όλ₯Ό μ€μ λ‘ κ΄λ¦¬νλ€. μ¦, μ€ν 컨ν μ€νΈλ μλ³μλ₯Ό λ±λ‘νκ³ κ΄λ¦¬νλ μ€μ½νμ μ½λ μ€ν μμ κ΄λ¦¬λ₯Ό ꡬνν λ΄λΆ λ©μ»€λμ¦μΌλ‘ λͺ¨λ μ½λλ μ€ν 컨ν μ€νΈλ₯Ό ν΅ν΄ μ€νλκ³ κ΄λ¦¬λλ€. μ€ν 컨ν μ€νΈμ μ€νμ μ½λ μ€ν μμλ₯Ό κ΄λ¦¬νλ€.κ·Έλ κΈ°μ ν΄λ‘μ , νΈμ΄μ€ν , μ€μ½νλ±μ κ°λ μ μ΄ν΄νλ λ° ν΅μ¬μ μ΄λ€.
(μμ€μ½λνκ°κ³Όμ )
1.μ²μ μ½λλ₯Ό μ€ννλ©΄ μ μ 컨ν μ€ν¬κ° μμ±λλ€.
2.ν¨μλ₯Ό νΈμΆν λλ§λ€ ν¨μ 컨ν μ€νΈκ° νλμ© λ μκΈ΄λ€.
(μμ€μ½λ μ€νκ³Όμ = λ°νμ)
3.λ³μλ λ³μ κ°μ²΄μμμ κ°μ μ°Ύκ³ , μλ€λ©΄ μ€μ½ν 체μΈμ λ°λΌ μ¬λΌκ°λ©° μ°Ύλλ€.
4.ν¨μ μ€νμ΄ λλλ©΄ ν΄λΉ 컨ν μ€νΈλ μ¬λΌμ§λ€ (λ¨, ν΄λ‘μ μ μΈ)
βA closure is the combination of a function and the lexical environment within which that function was declared.β
ν΄λ‘μ λ ν¨μμ κ·Έ ν¨μκ° μ μΈλμ λμ λ μ컬 νκ²½(Lexical environment)κ³Όμ μ‘°ν©μ΄λ€.
(μΆμ²: MDN)
μλ°μ€ν¬λ¦½νΈ μμ§μ ν¨μλ₯Ό μ΄λμ νΈμΆνλμ§κ° μλλΌ ν¨μλ₯Ό μ΄λμ μ μνλμ§μ λ°λΌ μμ μ€μ½νλ₯Ό κ²°μ νλ€. μ΄λ₯Ό λ μ컬 μ€μ½ν(μ μ μ€μ½ν)λΌ νλ€. μ μ μμμ λ§νλ βν¨μβλ λ°νλ λ΄λΆν¨μλ₯Ό μλ―Ένκ³ βκ·Έ ν¨μκ° μ μΈλ λμ λ μ컬 νκ²½(Lexical environment)βλ λ΄λΆ ν¨μκ° μ μΈλμ λμ μ€μ½νλ₯Ό μλ―Ένλ€. μ¦, ν΄λ‘μ λ λ°νλ λ΄λΆν¨μκ° μμ μ΄ μ μΈλμ λμ νκ²½(Lexical environment)μΈ μ€μ½νλ₯Ό κΈ°μ΅νμ¬ μμ μ΄ μ μΈλμ λμ νκ²½(μ€μ½ν) λ°μμ νΈμΆλμ΄λ κ·Έ νκ²½(μ€μ½ν)μ μ κ·Όν μ μλ ν¨μλ₯Ό λ§νλ€. μ΄λ₯Ό μ‘°κΈ λ κ°λ¨ν λ§νλ©΄ ν΄λ‘μ λ μμ μ΄ μμ±λ λμ νκ²½(Lexical environment)μ κΈ°μ΅νλ ν¨μλ€λΌκ³ λ§ν μ μκ² λ€.
//example
const x = 1;
function foo() {
const x = 10;
bar();
}
function bar() {
console.log(x);
}
foo(); //1
bar(); //1
// λ ν¨μ λͺ¨λ μ μμμ μ μ λμκΈ° λλ¬Έμ, bar()λ foo() λ΄λΆ λ³μμ μ κ·Ό λΆκ°λ₯.
νΈμ΄μ€ν μ΄λ λ³μλ₯Ό μ μΈνκ³ μ΄κΈ°ννμ λ μ μΈ λΆλΆμ΄ μ΅μλ¨μΌλ‘ λμ΄μ¬λ €μ§λ νμμ μλ―Ένλ€. λ³μλ μ μΈλΆλΆλ§ λμ΄μ¬λ €μ§λ€. ν¨μ ννμμ΄ μλλΌ ν¨μ μ μΈμμΌ λλ μ μμ²΄κ° ν΅μ§Έλ‘ λμ΄μ¬λ €μ§λ€. μ¦ μ μΈκ³Ό λμμ λμ λλ€. κ·Έλμ νΈμΆμ μ μΈ μ΄μ μ ν΄λ λμνλ€. λ¨, ννμμΌλ‘ μ μΈν κ²½μ° μλ¬ λ°μ.
ν΄λ‘μ λ jsλ§μ κ°λ μ μλλ€. ν¨μλ₯Ό μΌκΈκ°μ²΄λ‘ μ·¨κΈνλ ν¨μν νλ‘κ·Έλλ° μΈμ΄μμ μ¬μ©λλ μ€μ νΉμ±μ΄λ€. μλ°μ€ν¬λ¦½νΈμ λͺ¨λ ν¨μλ μμ μ€μ½νλ₯Ό κΈ°μ΅νλ©°, μ΄λμ νΈμΆνλ μ§ μκ΄μμ΄ μ μ§λλ€. κ·Έλ¬λ, μμ μ€μ½νμ μ΄λ€ μλ³μλ μ°Έμ‘°νμ§ μλ ν¨μλ, λΈλΌμ°μ μ μ΅μ νλ₯Ό μν΄ μμ μ€μ½νλ₯Ό κΈ°μ΅νμ§ μλλ€. ν΄λ‘μ λ 1. μ€μ²© ν¨μκ° μμ μ€μ½νμ μλ³μλ₯Ό μ°Έμ‘°νκ³ μκ³ 2.μ€μ²© ν¨μκ° μΈλΆ ν¨μλ³΄λ€ λ μ€λ μ μ§λλ κ²½μ°μ νμ νλ κ²μ΄ μΌλ°μ μ΄λ€.
//ν΄λ‘μ λΌκ³ νμ§ μλλ€.
function foo() {
const x = 1;
//μμ μ€μ½νμ μλ³μλ₯Ό μ°Έμ‘°νμ§ μλλ€.
function bar() {
const z = 3;
debugger;
console.log(z);
}
}
function foo() {
const x = 1;
//barλ ν΄λ‘μ μμ§λ§ κ³§λ°λ‘ μλ©Ένλ©° μΈλΆλ‘ λ°νλμ§ μλλ€.
//ν΄λ‘μ λΌκ³ νμ§ μλλ€.
function bar() {
console.log(x);
}
bar();
}
foo();
function foo() {
const x = 1;
//ν΄λ‘μ
//μΈλΆ ν¨μλ³΄λ€ λ μ€λ μ μ§λλ©° μμ μ€μ½νμ μλ³μλ₯Ό μ¬μ©νλ€.
function bar() {
console.log(x);
}
return bar();
}
const bar = foo();
bar();
ν΄λ‘μ λ μνκ° μλμΉ μκ² λ³κ²½λμ§ μλλ‘ μμ νκ² μλνκ³ νΉμ ν¨μμκ²λ§ μν λ³κ²½μ νμ©νμ¬ μνλ₯Ό μμ νκ² λ³κ²½νκ³ μ μ§νκΈ° μν΄ μ¬μ©νλ€. (λΆλ³μ± μ μ§) μΌλ°μ μΌλ‘ λ³μ κ°μ λκ΅°κ°μ μν΄ μΈμ λ μ§ λ³κ²½λ μ μμ΄ μ€λ₯ λ°μμ κ·Όλ³Έμ μμΈμ΄ λ μ μλ€. μΈλΆ μν λ³κ²½μ΄λ κ°λ³ λ°μ΄ν°λ₯Ό νΌνκ³ λΆλ³μ±μ μ§ν₯νλ ν¨μν νλ‘κ·Έλλ°μμ λΆμ ν¨κ³Όλ₯Ό μ΅λν μ΅μ νμ¬ μ€λ₯λ₯Ό νΌνκ³ νλ‘κ·Έλ¨μ μμ μ±μ λμ΄κΈ° μν΄ ν΄λ‘μ λ μ κ·Ήμ μΌλ‘ μ¬μ©λλ€.
function makeCounter(){
let num = 0; //μλν
return function(){
return num++;
}
}
let counter = makeCounter();
console.log(counter()); //0;
console.log(counter()); //1;
console.log(counter());//2;
function Counter() {
// μΉ΄μ΄νΈλ₯Ό μ μ§νκΈ° μν μμ λ³μ
var counter = 0;
// ν΄λ‘μ
this.increase = function () {
return ++counter;
};
// ν΄λ‘μ
this.decrease = function () {
return --counter;
};
}
const counter = new Counter();
console.log(counter.increase()); // 1
console.log(counter.decrease()); // 0
μΆμ²:
https://poiemaweb.com/js-closure