학습 내용
함수는 자바스크립트에서 특별한 대우를 받는 일급객체이다.
일급 객체로써의 함수 특징
-- 변수에 할당(assignment) 할 수 있다.
-- 다른 함수의 인자(argument)로 전달될 수 있다.
-- 다른 함수의 결과로서 리턴될 수 있다.
변수에 함수를 할당하는 경우
const square = function (num) {
return num * num;
};
output = square(7);
console.log(output); // 49
function double(num) {
return num * 2;
}
function doubleNum(func, num) {
return func(num);
}
let output = doubleNum(double, 4);
console.log(output); // 8
// 함수 doubleNum 은 다른 함수를 인자로 받는 고차함수
// 함수 func, 함수 dobule 가 콜백 함수
function adder(added) {
return function (num) {
return num + added;
};
}
let output = adder(5)(3); // 8
console.log(output); // 8
// 함수 adder 는 다른 함수 를 리턴하기에 고차함수
const add3 = adder(3);
output = add3(2);
console.log(output); // 5
// 함수는 일급 객체이기에 함수 adder 를 변수에 저장할수 있다.
unction double(num) {
return num * 2;
}
function doubleAdder(added, func) {
const doubled = func(added);
return function (num) {
return num + doubled;
};
}
doubleAdder(5, double)(3); // 13
const addTwice3 = doubleAdder(3, double);
addTwice3(2); // 8
const isEven = function (num) {
return num % 2 === 0;
}; // '가' 식
let output = arr.filter(isEven); // '나' 식
let output = arr.filter(function (num) {
return num % 2 === 0;
}) // '다'식 = '가'식 + '나'식
let arr = [1, 2, 3, 4];
console.log(output); // [2, 4]
const double = function (index) {
return index * 2 ;
}; // '가' 식
let output = arr.map(double); // '나' 식
let output = arr.map(function (index) {
return index * 2 ;
}) // '다'식 = '가'식 + '나'식
let arr = [1, 2, 3, 4];
console.log(output); // [2, 4, 6, 8]
function isSum (sum, index) {
return sum + index;
}
let initialValue = 0;
let output = arr.reduce(isSum, initialValue);
let arr = [1, 2, 3, 4];
console.log(output); // 10
function 함수이름 (응축되는 곳, 요소) {
return 응축되는 곳 + 요소;
}
let 초기값변수 = 0;
let output = 적용대상.reduce(함수이름, 초기값변수);
// 초기값 변수를 0으로 줬기에 응축되는 곳이 시작도 0이다.
느낀 점
기존에 알고리즘을 짜는게 1차원적 이라고 한다면 고차함수를 배우면서 2차원적으로 들어갔다는 느낌이다. 고차함수를 이용한다면 기존에 쓰던반복문이나 조건문 등을 대체하고 코드의 길이를 많이 줄일 수 있다는 느낌이다. 오늘 배운 것을 완벽히 내것으로 만들어 기존에 반복문, 조건문으로 해결할려는 계획을 한번 더 생각해서 고차함수로는 안될까? 하는 생각을 한번 더 가져봐야겠다.
미비한 점
1. 나머지 고차함수 학습(forEach, find, sort, some, every)
2. MapReduce 학습하기 (MapReduce Model)
3. 자바스크립트에서 커링(currying)과 클로저(closure)의 차이 이해하기 (js closure vs curry)
4. 선언형 프로그래밍(declarative programming)과 절차형 프로그래밍(imperative programming)의 차이를 배열 메소드를 통해 이해하기 (js imperative vs declarative)
5. 함수의 조합(function composition)에 대해 학습하기 (javascript function composition)