λͺ©μ°¨
- ν¨μν νλ‘κ·Έλλ°
- ν¨μν νλ‘κ·Έλλ° κΈ°λ²
- κ³ μ°¨ ν¨μ
- νμ΄ν ν¨μ
- ν΄λ‘μ (Closure)
- 컀λ§(Currying)
ν¨μν νλ‘κ·Έλλ°
μ°μ°ν λμμ΄ ν¨μκ° λλ νλ‘κ·Έλλ° ν¨λ¬λ€μμΌλ‘ λ΄λΆ λ°μ΄ν°μ μνλ₯Ό κ·Έλλ‘ λκ³ μ¬λ¬ ν¨μλ₯Ό μ‘°ν©νμ¬ μμ μ μννλ λ°©μμ΄λ€. μ μΈμ λ°©μμΌλ‘ ꡬνλλ©° νλ¦ μ μ΄λ₯Ό λͺ μμ μΌλ‘ κΈ°μ νμ§ μκ³ λ‘μ§μ νννλ€.
ν¨μν νλ‘κ·Έλλ° νΉμ§
π‘ λͺ λ Ήνμ΄ μλ μ μΈνμ΄λ€.
λͺ λ Ήν νλ‘κ·Έλλ°μ 무μμ μ΄λ»κ² ν κ²μΈκ°μ μ§μ€νλ€. ex) html, Lisp, Sql λ±
// λ°°μ΄ λ΄ μμλ₯Ό λλ¬Έμλ‘ λ°κΎΈλ μ½λ
// λ°°μ΄ λ΄ μμλ₯Ό iλ₯Ό μ¦κ°ν΄μ£Όλ©° νλμ© μ κ·Όνμ¬ λλ¬Έμλ‘ λ°κΎΈκ³ μ λ°°μ΄μ λ΄μμ€λ€.
const arr = ['a', 'b', 'c'];
const result = new Array();
for (var i = 0; i < arr.length; i++) {
result.push(arr[i].toUpperCase());
}
console.log(result); // ["A", "B", "C"]
μ μΈν νλ‘κ·Έλλ°μ 무μμ ν κ²μΈκ°μ μ§μ€νλ€. ex) C, C++, Java, Pascal λ±
// λ°°μ΄ λ΄ μμλ₯Ό λλ¬Έμλ‘ λ°κΎΈλ μ½λ
// λ°°μ΄ λ΄ λͺ¨λ μμμ λλ¬Έμλ‘ λ°κΎΈλ ν¨μλ₯Ό μ μ©νλ€.
const arr = ['a', 'b', 'c'];
console.log(arr.map(a => a.toUpperCase())); // ["A", "B", "C"]
μ μΈν λ°©μμ μ¬μ©νκΈ° μν΄μλ λͺ λ ΉνμΌλ‘ μ΄λ»κ² ν κ²μΈμ§ ꡬνλ κ²λ€μ΄ μΆμν λμ΄ μμ΄μΌ νλ€.
μ¦, μ μΈν λ°©μμ μΆμν λμ΄μλ λͺ λ Ήν λ°©μμ μ¬μ©νλ κ²μ΄λ€.
π‘ λΆμν¨κ³Ό(Side Effect)κ° μλ€.
λΆμν¨κ³Όλ ν¨μκ° λ§λ€μ΄μ§ λͺ©μ κ³Ό λ€λ₯Έ ν¨κ³Όλ λΆμμ©μ μλ―Ένλ€.
λΆμν¨κ³Όκ° λ°μνλ κ²½μ°λ μλμ κ°λ€.
- μ μλ²μμμ λ³μ, μμ±, μλ£κ΅¬μ‘°λ₯Ό λ³κ²½ν λ
- thisλ₯Ό μ¬μ©ν λ
- ν¨μμ μλ μΈμ κ°μ λ³κ²½ν λ
- μμΈλ₯Ό μΌμΌν¨ ν¨μκ° κ·Έλλ‘ μμΈλ₯Ό λμ§ λ
// λΆμν¨μ: 맀κ°λ³μμ κ°μ μ§μ λ³κ²½, λΆμν¨κ³Όλ‘ κΈ°μ‘΄ λ°°μ΄μ κ° λ³κ²½
var arr = ['a', 'b', 'c'];
var impure = (x) => {
x.push('d'); // κΈ°μ‘΄ λ°°μ΄ κ°κΉμ§ λ³κ²½
return x;
}
console.log(impure(arr)); // ["a", "b", "c", "d"]
console.log(arr); // ["a", "b", "c", "d"]
// μμν¨μ: 맀κ°λ³μλ₯Ό 볡μ¬ν κ°μ λ³κ²½
var arr = ['a', 'b', 'c'];
var pure = (x) => {
newArr = [...x, 'd']; // κΈ°μ‘΄ λ°°μ΄ κ°μ λ³κ²½νμ§ μκ³ νΌμΉ¨ μ°μ°μλ‘ μλ‘μ΄ λ°°μ΄μ μΆκ°
return newArr;
}
console.log(pure(arr)); // ["a", "b", "c", "d"]
console.log(arr); // ["a", "b", "c"]
λΆμν¨κ³Όκ° μλ ν¨μλ μμν¨μ, μλ ν¨μλ₯Ό λΆμν¨μκ° λλ€.
μμν¨μλ μΈλΆμ μμΈμ 건λ€μ΄μ§ μμ μ± λ§€κ°λ³μλ₯Ό λ°μ μ ν΄μ§ λ‘μ§λ§μ μ²λ¦¬νλ ν¨μμ΄λ€.
μμν¨μκ° λλ €λ©΄ μλμ 쑰건μ λ§μ‘±ν΄μΌ νλ€.
- νλ μ΄μμ μΈμλ₯Ό λ°μμΌ νλ€.
- λ°ν κ°μ΄ λ°λμ μ‘΄μ¬ν΄μΌ νλ€.
- ν¨μ λ΄μμ μΈμλ₯Ό μ μΈν λ€λ₯Έ λ³μλ₯Ό μ¬μ©νλ©΄ μλλ€.
- λμΌ μ λ ₯, μΆλ ₯μ΄ λ³΄μ₯λμ΄μΌ νλ€. (맀κ°λ³μλ‘ μμ μ μ²λ¦¬νκ³ κ²°κ³Όλ₯Ό λ°νν΄μΌ νλ€.)
// μμν¨μX (μΈμλ‘ λ°μ§ μμ cond λ³μλ₯Ό ν¨μ μμμ μ¬μ©)
var arr = ['a', 'b', 'c'];
var cond = x => x.toUpperCase();
var ex = function(array) {
return array.map(cond);
};
console.log(ex(arr)); // ["A", "B", "C"]
// μμν¨μO
var ex = function(array, condition) {
return array.map(condition);
};
var arr = ['a', 'b', 'c'];
var cond = x => x.toUpperCase();
console.log(ex(arr, cond)); // ["A", "B", "C"]
κ°μ μ λ ₯μ λν΄ νμ κ°μ μΆλ ₯λ§μ 보μ₯νλ ν μ€νΈμ μΆμ μ΄ μ½κ³ λ€λ₯Έ κ³³μ μν₯μ μ£Όμ§ μμ νμ©νκΈ° μ½λ€λ μ₯μ μ΄ μλ€.
π‘ μν λ³μ΄λ₯Ό μ΅μν νλ€. (λΆλ³μ±)
μν λ³μ΄λ λ©λͺ¨λ¦¬μ μ μ₯λ κ°μ λ³κ²½(λ³μμ μ¬ν λΉ λ±)νλ κ²μ μλ―Ένλ€.λΆλ³μ±μ μ§ν€λ©΄ 무λΆλ³ν μνμ λ³κ²½μ λ§κ³ μνμ λ³κ²½μ μΆμ νκΈ° μ½λ€.
π λ³μμ λ©λͺ¨λ¦¬
- μ μΈ: λ³μλ₯Ό ν΅ν΄ μ κ·Όν μ μλ λ©λͺ¨λ¦¬ κ³΅κ° ν보 ex) let num;
- ν λΉ: λ©λͺ¨λ¦¬ 곡κ°μ κ° μ μ₯ ex) num = 10;
μλ°μ€ν¬λ¦½νΈμμ string, number, boolean νμ κ°μ μμ μλ£νμ κ²½μ° λ³μλ₯Ό μ¬ν λΉ νλλΌλ μλ³Έ λ³μμ λ΄κΈ΄ κ°μ λ³νμ§ μκ³ λ€λ₯Έ λ©λͺ¨λ¦¬ μ£Όμμ 볡μ¬ν΄μ μ¬μ©νλ€. (κ°μ μν νΈμΆ)
Array, Object νμ κ³Ό κ°μ κ°μ²΄λ€μ μλ³Έ λ³μμ λ©λͺ¨λ¦¬ κ°μ΄ μ§μ λ³κ²½λλ€. (μ£Όμμ μν νΈμΆ)
μν λ³μ΄λ λ©λͺ¨λ¦¬μ μ μ₯λ κ°μ΄ λ³κ²½λλ κ²μ μλ―Ένλ©° λμμ λΆλ³μ±μ μ§ν€μ§ μμλ€λ μλ―Έμ΄κΈ°λ νλ€.
π‘ μ°Έμ‘° ν¬λͺ μ±μ κ°μ§λ€.
ννμμ ν΄λΉ ννμμ κ²°κ³Όλ‘ λ체ν΄λ μ무 μν₯μ΄ μλ€λ©΄ μ°Έμ‘°μ ν¬λͺ νλ€κ³ μκΈ°νλ€.
μλ₯Ό λ€μ΄ 1 + 9 ννμμ ν΄λΉ ννμμ κ²°κ³ΌμΈ 10μΌλ‘ μΉνν΄λ μλ¬΄λ° λ¬Έμ κ° μκΈ° λλ¬Έμ μ°Έμ‘°μ ν¬λͺ νλ€.
function add(a, b) {
return a + b;
}
function multiple(a, b) {
return a * b;
}
// multiple(1, 2)λ₯Ό 2λ‘ λ체ν΄λ μν₯ μμ
console.log(add(5, multiple(1, 2)));
function add(a, b) {
var result = a + b;
console.log('result: ' + result);
return result;
}
// add(3, 4)λ₯Ό 12λ‘ λ°κΎΈλ©΄ κ²°κ³Όκ° λ€λ¦
console.log(add(3, 4));
ν¨μν νλ‘κ·Έλλ° μμΉ
- μ μΆλ ₯μ΄ μμν΄μΌ νλ€.
- λΆμ°λ¬Όμ΄ μμ΄μΌ νλ€.
- ν¨μμ λ°μ΄ν°λ₯Ό μ€μ μΌλ‘ μκ°ν΄μΌ νλ€.
ν¨μν νλ‘κ·Έλλ° κΈ°λ²
μμλ κ²
μλ°μ€ν¬λ¦½νΈμμ ν¨μλ₯Ό λ³μμ ν λΉν μ μλ€.
// λ³μμ ν¨μ ν λΉ
const add = function(a, b) {
return a + b;
}
add(1, 3); // 4
// ν¨μλ₯Ό λ€λ₯Έ λ³μμ λκΈ°κΈ°
const copyAdd = add;
copyAdd(3, 2); // 5
μλ°μ€ν¬λ¦½νΈμμ ν¨μλ₯Ό νλΌλ―Έν°λ‘ λκΈΈ μ μλ€.
function hello() {
return 'hello';
}
// ν¨μλ₯Ό νλΌλ―Έν°λ‘ λ°λ ν¨μ
function print(func) {
console.log(func); // function hello() { return 'hello'; }
console.log(func()); // hello
}
// ν¨μλ₯Ό νλΌλ―Έν°λ‘ λκΈ°κΈ°
print(hello);
κ³ μ°¨ν¨μ (HOF, Higher-Order Function)
ν¨μλ₯Ό 맀κ°λ³μλ‘ μ¬μ©νκ±°λ ν¨μλ₯Ό λ°ννλ ν¨μμ΄λ€.
κ°μ μ λ ₯λ°κ³ λ‘μ§μ μ²λ¦¬νμ¬ λ°ννλ λ‘μ§μ κ°μΆλ μΆμν λ¨κ³(ν¨μ)μμ ν λ¨κ³ λ λμ¬ ν¨μλ₯Ό μ λ¬λ°μ μ²λ¦¬νλ―λ‘ λμ μΆμν μμ€μ κ°μ§λ€λ μ΄μ μ΄ μλ€.
// ν¨μλ₯Ό 맀κ°λ³μλ‘ μ¬μ©νλ ν¨μ
function foo(f) {
f();
}
// ν¨μλ₯Ό λ°ννλ ν¨μ
function foo() {
return function() {};
}
μλ°μ€ν¬λ¦½νΈμ κΈ°λ³Έμ μΌλ‘ λ΄μ₯λ κ³ μ°¨ ν¨μ μ€ λ§μ΄ μ¬μ©λλ ν¨μλ€μ΄λ€.
ν¨μλͺ | κΈ°λ₯ |
forEach | κ° μμμ ν¨μλ₯Ό μ μ©(μλ‘μ΄ λ°°μ΄μ λ°ννμ§ μμ) |
filter | νΉμ 쑰건μ λ§μ‘±νλ μμλ₯Ό μλ‘μ΄ λ°°μ΄λ‘ λ°ν |
find | λ°°μ΄μ μμλ₯Ό μννλ©΄μ 쑰건μ μΌμΉνλ μμμ κ°μ μ¦μ λ°ν |
map | κ° μμμ ν¨μλ₯Ό μ μ©ν κ°μ μλ‘μ΄ λ°°μ΄λ‘ λ°ν |
reduce | κ° μμμ λν΄ reducer ν¨μλ₯Ό μ€ννκ³ νλμ κ²°κ³Ό κ°μ λ°ν |
sort | μ λ ¬ |
const arr1 = ['a', 'b', 'c'];
const arr2 = ['aria', 'brick', 'cathy'];
const arr3 = [-1, 0, 4, -2, 3];
const arr5 = [1, 2, 3, 4, 5];
const arr6 = [2, 1, 4, 5, 3];
// 1. forEach
// μ½λ°± ν¨μ λ΄μμ μ²λ¦¬ ν !λ°ν! λΆκ°(μ΄λ° κ²½μ° map μ¬μ©)
arr1.forEach(function(element, index){
console.log(index + ': ' + element); // 0: a, 1: b, 2: c
});
// νμ΄ν ν¨μ μ΄μ©
arr1.forEach(element => console.log(element)); // a, b, c
// 2. filter
let result = arr2.filter(element => element.startsWith('a'));
console.log(result); // ["aria"]
// 3. find
// 0 μ΄μμ λ§μ‘±νλ 첫 λ²μ§Έ μμ λ°ν
result = arr3.find(element => element > 0);
console.log(result); // 4
// λ§μ‘±νλ μμκ° μμΌλ©΄ undefined λ°ν
result = arr3.find(element => element > 10);
console.log(result); // undefined
// 4. map
// ν¨μλ₯Ό νΈμΆν κ²°κ³Όλ₯Ό μλ‘μ΄ λ°°μ΄λ‘ λ°ν
result = arr1.map(x => x.toUpperCase());
console.log(result); // ["A", "B", "C"]
// 5. reduce
const reducer = (previousValue, currentValue) => previousValue + currentValue;
console.log(arr5.reduce(reducer)); // 15(1+2+3+4+5)
// 6. sort
arr6.sort(function(a, b) {
return a - b;
});
console.log(arr6); // [1, 2, 3, 4, 5]
νμ΄ν ν¨μ (Arrow Function)
function λμ νμ΄ν(=>)λ₯Ό μ΄μ©νμ¬ κ°λ¨ν ν¨μλ₯Ό νννλ λ°©λ²μ΄λ€.
π νμ΄ν ν¨μ κΈ°λ³Έ
// νμ΄ν ν¨μ μ΄μ©(μλ ν¨μμ μΆμ½ν)
const func = (arg1, arg2, ...argN) => expression
// κΈ°λ³Έ ν¨μ
const func = function(arg1, arg2, ...argN) {
return expression;
};
π μλ΅ κ°λ₯ν κ²
// 맀κ°λ³μκ° νλμΈ κ²½μ° μΈμ μκ΄νΈ μλ΅ κ°λ₯
singleParam => { statement }
// 맀κ°λ³μκ° μλ κ²½μ° μΈμ μκ΄νΈ νμ
() => { statement }
// λ³Έλ¬Έμ΄ ν μ€μΈ κ²½μ° λ³Έλ¬Έ μ€κ΄νΈ μλ΅ κ°λ₯
const sum = (a, b) => a + b;
// λ³Έλ¬Έμ΄ μ¬λ¬ μ€μΈ κ²½μ°
const sum = (a, b) => {
const result = a + b;
return result; // λ³Έλ¬Έμ΄ μ¬λ¬ μ€μΈ κ²½μ° return μ§μμλ‘ κ²°κ³Ό κ°μ κΌ λ°νν΄μΌ νλ€.
};
ν΄λ‘μ (Closure)
μΈλΆ ν¨μμ μ κ·Όν μ μλ λ΄λΆ ν¨μμ μλ¦¬λ‘ λ΄λΆν¨μμμ μΈλΆν¨μ μ€μ½νμ μ μΈλ λ³μμ μ κ·Ό κ°λ₯νμ§λ§ κ·Έ λ°λλ λΆκ°λ₯νλ€.
function outerFunction() {
let msg = ''; // μμ λ³μλΌκ³ λΆλ¦
return function innerFunction(newMsg) { // ν΄λ‘μ
msg = msg + newMsg;
return msg;
}
}
// test λ³μλ innerFunction ν¨μ μ°Έμ‘°
// outerFunctionμ μ€ν 컨ν
μ€νΈλ μλ©Έλ¨
let test = outerFunction();
test('po'); // "po";
test('ta'); // "pota";
test('to'); // "potato";
λ³μ msgλ ν¨μμ μ€ν 컨ν μ€νΈκ° μ’ λ£λλ©΄ μΈλΆμμ μ κ·Όν μ μλ€. ν¨μ λ°μμλ msg λ³μλ₯Ό μ¬μ©νκΈ° μν΄μλ ν΄λ‘μ λ₯Ό μ¬μ©νλ©΄ λλ€. ν΄λ‘μ λ λ°νλ λ΄λΆν¨μκ° μμ μ΄ μ μΈλμμ λμ νκ²½(μ€μ½ν)μ κΈ°μ΅νκ³ κ·Έ μ€μ½ν λ°μμ νΈμΆλμ΄λ μ κ·Όν μ μλ μ리λ₯Ό λ§νλ€. κΌ λ΄λΆ ν¨μλ₯Ό λ°ννλ κ°λ μμ²΄κ° ν΄λ‘μ κ° μλλ©° μλμ κ°μ΄ μ¬μ©ν μλ μλ€.
let globalFunction;
{
let msg = '';
globalFunction = function(newMsg) { // ν΄λ‘μ
msg = msg + newMsg;
return msg;
}
}
globalFunction('po'); // "po";
globalFunction('to'); // "pota";
globalFunction('to'); // "potato";
ν΄λ‘μ λ νμ¬ μνλ₯Ό κΈ°μ΅νκ³ λ³κ²½λ μ΅μ μνλ₯Ό μ μ§νλ€λ μ μμ μ μ©νκ² μ¬μ©λ μ μλ€.(λ³μκ° μλ©Έλμ§ μκ³ λ§μ§λ§ μνλ₯Ό κΈ°μ΅νλ€λ μ )
μ μ λ³μμ μ¬μ©μ μ€μ΄κ³ μ½λ μ¬μ¬μ©μ μ©μ΄νλ€λ μ₯μ μ΄ μμ§λ§ var λ³μλ₯Ό μ¬μ©νλ κ²½μ°μ μ μν΄μΌ νλ€.
μ»€λ§ (Currying)
μΈμλ₯Ό μ¬λ¬ κ° λ°λ ν¨μλ₯Ό λΆλ¦¬νμ¬ μΈμλ₯Ό νλμ©λ§ λ°λ ν¨μμ 체μΈμΌλ‘ λ§λλ λ°©λ²μ΄λ€.
function uncurrying(greeting, name){
console.log(greeting + ", " + name);
}
function currying(greeting){
return function(name){
console.log(greeting + ", " + name);
}
}
// μ»€λ§ μμ΄ νλΌλ―Έν° λ κ°λ₯Ό λ°λ κ²½μ°
uncurrying("hello", "anna"); // "hello, anna"
// 컀λ§
var hello = currying("hello");
hello("jane"); // "hello, jane"
hello("angela"); // "hello, angela"
// μ»€λ§ λ³νμ νλ ν¨μ
function curry(f) {
return function(x) {
return function(y) {
return f(x, y);
};
};
}
// μ»€λ§ λ³νμ νλ ν¨μλ₯Ό νμ΄ν ν¨μλ‘ ννν κ² (μ curry ν¨μμ λμΌ)
// const curry = f => x => y => f(x, y);
// fμ μ λ¬λ ν¨μ: (a, b) => a * b
const curried = curry((a, b) => a * b);
// aμ 10, bμ 5μ λ¬
curried(10)(5); // 50
μ μμμ²λΌ κ°μ μΈμλ₯Ό μ¬λ¬ λ² μ λ¬ν΄μΌ νλ κ²½μ° μ μ©νκ² μ¬μ©λ μ μλ€.
μ»€λ§ ν¨μμμλ μΈμμ μμλ₯Ό μ κ²½μ¨μΌ νλλ°, κ°μ₯ λ¨Όμ λ°λ μΈμ(μΈλΆ ν¨μ)λ λ³νμ§ μκ³ κ°μ₯ λμ€μ λ°λ μΈμ(λ΄λΆ ν¨μ)λ κ°λ³μ μΌλ‘ ꡬμ±νλ κ²μ΄ μ’λ€.
μ°Έκ³ μλ£ λ° μΆμ² πβοΈ
https://chifuyu.tistory.com/35?category=1174105
https://yeongseungjeong.tistory.com/37
https://helloworldjavascript.net/pages/255-fp.html
'κ°λ° > Javascript' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
ES6 Syntax (0) | 2022.05.03 |
---|---|
TypeScript (0) | 2022.04.28 |
μλ°μ€ν¬λ¦½νΈ λΉλκΈ° μ²λ¦¬ / Promise / async / await / fetch (0) | 2022.04.20 |
Promise ν¨ν΄ (0) | 2022.04.14 |
javascript λ³μ / νΈμ΄μ€ν / var, let, const μ°¨μ΄ (0) | 2022.01.26 |
λκΈ