컀λ§ν¨μμ ν΄λ‘μ μ μ°¨μ΄μ λν΄ μμ보μμ΅λλ€.
컀λ§ν¨μκ° ν΄λ‘μ μ μ¬μ© μ¬λ‘ μ€ νλλΌκ³ λ§νλ μμ§λμ΄κ° μλ λ°λ©΄,
ν΄λ‘μ λ μλ°μ€ν¬λ¦½νΈμ ν΅μ¬ κΈ°λ₯μ΄κ³ , 컀λ§ν¨μλ μλ°μ€ν¬λ¦½νΈμ λ΄μ₯ μ§μλμ§ μκΈ° λλ¬Έμ μμ ν λ€λ₯Έ κ°λ μ΄λΌκ³ λ§νλ μμ§λμ΄κ° μμμ΅λλ€.
1. closure : μλ°μ€ν¬λ¦½νΈμ ν΅μ¬ κΈ°λ₯ μ€ νλμ λλ€.
ν΄λ‘μ λ μΈλΆ ν¨μ λ²μμ μΈλΆ ν¨μ μΈλΆμμ μ€νλλ κ²½μ°μλ μμ λͺ¨λ λ²μμ μ‘μΈμ€ν μ μλ λ΄λΆ ν¨μμ λλ€.
- ν΄λ‘μ λ₯Ό μΈμ μΈκΉ?
μ£Όλ‘ μ 보λ₯Ό μλν λ μ¬μ©νκ³ , μ μ λ³μμ μ¬μ©μ μ΅μ νκΈ° μν΄ μ¬μ©ν©λλ€.
function numbers(firstNum, secondNum) {
let a = 'The result is';
return add();
}
function add() {
let b = firstNum + secondNum;
return a + b;
}
console.log(numbers(2,5));
// μΆλ ₯κ°: ReferenceError: firstNum is not defined
add()κ° numbers() μΈλΆμ μ μλμ΄ μκΈ° λλ¬Έμ numbers()μ λ³μμ μ‘μΈμ€ν μ μμ΅λλ€. κ·Έλμ firstNumμ΄ μ μλμ§ μμλ€λ μ€λ₯κ° λ°μν©λλ€.
μμ κ°μ λ²μλ‘ μΈν΄ λ°ννλ λ¬Έμ λ₯Ό 극볡νκΈ° μν΄ λμ¨ κ²μ΄ λ°λ‘ closer μ λλ€.
CLOSURES λ λ³μ λ° μ μ λ³μ μΈμ λ€λ₯Έ ν¨μμ λ³μμ μ‘μΈμ€ν μ μλ ν¨μμ λλ€.
function numbers(firstNum, secondNum) {
let a = 'The result is ';
function add() {
let b = firstNum + secondNum;
return a + b;
}
return add();
}
console.log(numbers(2,5));
// μΆλ ₯κ°: The result is 7
μ΄ κ²½μ° add()λ numbers() λ΄λΆμ μ μλμ΄ μμΌλ©° λͺ¨λ λ³μμ μ‘μΈμ€ν μ μμ΅λλ€. λ°λΌμ μΆλ ₯μ ‘The result is 7’ μ΄ λ©λλ€.
2. currying: μλ°μ€ν¬λ¦½νΈμ λ΄μ₯ μ§μμ΄ λμ§ μλ ν¨μμ λλ€.
ν΄λ‘μ λ μλ°μ€ν¬λ¦½νΈμ ν΅μ¬ κΈ°λ₯μ΄μ§λ§, 컀λ§ν¨μλ μλ°μ€ν¬λ¦½νΈμμ μ체μ μΌλ‘ λ΄μ₯ μ§μμ΄ λμ§ μλ ν¨μλΌκ³ ν©λλ€. μ κ° μμ΄λ₯Ό λ²μν κ²μ΄λΌ μ΄μνκ² λκ»΄μ§ μ λ μμ΅λλ€. (no builtin support)
μ»€λ§ ν¨μλ ν΄λ‘μ μ μ¬μ© μ¬λ‘ μ€ νλμ λλ€.
μ»€λ§ ν¨μλ ν λ²μ λͺ¨λ μΈμλ₯Ό μ·¨νλ λμ μ¬λ¬ μΈμλ₯Ό ν λ²μ νλμ© μ·¨νλ ν¨μλ₯Ό λΆν΄νλ ν¨μμ λλ€.
μ»€λ§ ν¨μμμ κ° μ€μ²© ν¨μλ ν΄λ‘μ μμ μΈλΆ ν¨μμ μ λ¬λ μΈμλ₯Ό μΆμ ν©λλ€.
- 컀λ§μ μΈμ μΈκΉ?
μ΄λ€ ν¨μλ₯Ό νΈμΆν λ λλΆλΆμ λ§€κ° λ³μκ° νμ λΉμ·νλ€λ©΄ 컀λ§μ μ°λ©΄ νΈνλ€.
μλ₯Ό λ€μ΄, μλ μ½λλ₯Ό μ»€λ§ ν¨μλ‘ λ³ννλ€λ©΄
function multiply(x, y, z){
return x, y, z;
}
console.log(multiply(3, 5, 7)); // 3*5*7
console.log(multiply(3, 5, 8)); // 3*5*8
console.log(multiply(3, 2, 1)); // 3*2*1
π 컀λ§ν¨μλ‘ λ³νν μ½λ
function multiply(x) {
return function(y) {
return function(z){
return x*y*z;
}
}
}
let multiply3 = multiply(3); // 3μ΄ κ³ μ λ¨
let multiply3And5 = multiply3(5); // 3κ³Ό 5κ° κ³ μ λ¨
let multiply3And2 = multiply3(2); // 3κ³Ό 2κ° κ³ μ λ¨
console.log(multiply3And5(7));
console.log(multiply3And5(8));
console.log(multiply3And2(1));
π λ€λ₯Έ μ»€λ§ ν¨μμ μμ μ½λ
var sayWhat = function(a){
return function(b){
return function(c){
console.log(`say ${a} to ${b} using ${c}`);
}
}
}
sayWhat("hello")("friends")("currying function"); // say hello to friends using currying function
π‘ νΉμ μλͺ»λ μ λ³΄κ° μλ€λ©΄ λκΈ λ¨κ²¨μ£ΌμΈμ. μ μ μ±μ₯μ λ§μ λμμ΄ λ©λλ€.
μ°Έκ³
https://codingnconcepts.com/javascript/lexical-scope-closures-and-currying/
https://www.quora.com/Is-there-any-difference-between-currying-and-closure-in-JavaScript