ν΄λ‘μ (Closure)
- μΈλΆν¨μμ λ³μμ μ κ·Όν μ μλ λ΄λΆν¨μ
- ν¨μμ ν¨μκ° μ μΈλ μ΄νμ νκ²½μ μ‘°ν© (μ΄νμ (lexical) νκ²½; λ³μ λ° ν¨μμ μΈμ νν)
// νμ΄ν ν¨μ(μ€κ΄νΈλ μλ€!)
const add = (x, y) => x + y;
add(1, 2); // 3;
// νμ΄ν ν¨μλ‘ ννν ν¨μ μμ ν¨μ
const adder = x => y => x + y;
adder(5); // y => x + y; // μ΄λ xμ 5κ° λ¨μ§ μμ§λ§ 5κ° μ
λ ₯λ μν
adder(5)(5); // 10; // ν¨μλ₯Ό 2λ² μΆλ ₯νλ€.
// ν¨μ ννμμΌλ‘
const adder = function(x) {
return function(y) {
return x + y;
}
}
typeof adder(2) // 'function'
typeof adder(2)(2) // 'number'
function value0 () {
let value = 0;
return value;
}
console.log(value); // Uncaught ReferenceError: value is not defined
value0 (); //0
// μμ 1)
const adder = function(x) {
return function(y) {
return x + y;
}
}
const add5 = adder(5); // μ λ¬μΈμ 5λ₯Ό 맀κ°λ³μ xμ λ΄μ μν
add5(1) // 6
// μμ 2)
// 2-1) νμ΄ν ν¨μ
const tagMaker = tag => content => `<${tag}>${content}</${tag}>`
// 2-2) ν¨μ ννμ
const tagMaker = function(tag) {
return function(content) {
return `<${tag}>${content}</${tag}>`
}
}
const divMaker = tagMaker('div'); //
console.log(divMaker); Ζ (content) {
return `<${tag}>${content}</${tag}>`
}
divMaker('hello'); // <div>hello</div>
** ν΄λ‘μ λ νΉμ λ°μ΄ν°(tag)λ₯Ό μ€μ½ν μ(function(tag))μ κ°λ μ±λ‘ κ³μ μ¬μ©ν μ μκ² νλ€.
// νμ΄ν ν¨μ
const makeCounter = () => {
let value = 0;
return {
increase: () => {
value = value + 1
},
decrease: () => {
value = value - 1
},
getValue: () => value
}
}
const counter1 = makeCounter();
counter1 = {increase: Ζ, decrease: Ζ, getValue: Ζ};
typeof counter1; // 'object'
// ν¨μ ννμμΌλ‘ λ§λ€μ΄λ³΄κΈ°(μ€ν¨)
// const makeCounter = function () {
// let value = 0;
// return {
// const increase: funtion () {
// value = value + 1;
// const decrease: funtion () {
// value = value - 1;
// const getValue: getValue () {
// value;
// }
// }
// }
// }
// }
const counter1 = makeCounter();
counter1.increase(); // 0 + 1 = 1
counter1.increase(); // 1 + 1 = 2
counter1.decrease(); // 2 - 1 = 1
counter1.getValue(); // 1;
const counter2 = makeCounter();
counter2.increase(); // 0 + 1 = 1
counter2.decrease(); // 1 - 1 = 0
counter2.decrease(); // 0 - 1 = -1
counter2.getValue(); // -1;
counter1κ³Ό counter2μμμ valueκ°μ κ°κ° 보쑴λ¨