고차함수 복습 21.03.21
in Dev on Java Script
- 함수 선언식
function a(param) {
return param;
}
- 함수 표현식
let b = function(param) {
return param;
}
고차 함수 = 일급 객체(함수를 파리미터에 사용, 수정, 변수에 대입 등과 같은 연산을 지원)
고차 함수 사용 방법
a(b('B'))
// B
// 함수를 실행한 값을 리턴 : ()를 붙인다.
a(b)
// b 함수 자체를 리턴
a(function b(param) {
return param;
})
// b 함수 자체를 리턴
// 두 코드는 같은 코드
// a는 고차 함수(함수를 인자로 받거나 함수를 리턴하는 함수)
// b는 콜백 함수(함수의 인자로 전달되는 함수)
- function return 방식
function functionParameter(str, func) {
return function () {
return func(str);
}
}
// 익명함수 function () { return func(str); } 자체를 return
function functionParameter(str, func) {
const result = func(str);
return result;
}
// 파라미터 func에 받은 콜백함수의 결과값을 return
- 함수 결합
// 두 개의 함수를 입력받아 두 함수가 결합된 새로운 함수를 리턴.
// 리턴되는 함수는 정수를 입력받아 func2, func1의 순으로 적용.
// func1, 2를 compose2 함수에 담고
function compose2(func1, func2) {
// 파라미터 num을 가진 익명 함수를 return
return function (num) {
// 익명 함수는 파라미터 num을 func2 함수를 실행하고
// 그 값을 func1의 인자로 받아 func2 실행한 값을 return
return func1(func2(num));
}
}
// function 함수를 return
// function compose2는 파라미터로 func1, 2를 갖고
function compose2 (func1, func2) {
// 그 실행 코드를 composedFunc에 담아준다.
const composedFunc = function (num) {
// composedFunc 함수는 각 결과 값을 변수에 담는다
const func2Result = func2(num);
const func1Result = func1(func2Result);
// 위 2개의 함수를 실행한 값을 return
return func1Result;
}
// compose2를 실행하면 composedFunc 코드를 실행한 값을 return.
return composedFunc;
}
// composedFunc 함수를 return
// 위 두 코드는 같은 결과를 내는 코드
function compose2(func1, func2) {
const composedFunc = function (num) {
return func1(func2(num));
}
return composedFunc();
}
// func1(func2(num))을 return
// 내부에 function 실행
function filteringWords(words) {
return words.filter(function (word) {
if (word.length > 5) {
if (word.length % 2 === 0) {
return true;
}
}
})
}
// function을 별도로 실행
function length5AndEven(word) {
let wordLen = word.length;
return wordLen > 5 && wordLen % 2 === 0 ? true : false;
}
function filteringWords(words) {
return words.filter(length5AndEven);
}
// 위 두 코드는 같은 코드
function classicMovies(arr, year) {
return arr.filter(function (movie) {
return movie.year < year;
}).map(function (filterMovie) {
return `${filterMovie.title}, ${filterMovie.year}`;
})
}
function classicMovies(arr, year) {
const beforeYear = arr.filter(function (movie) {
return movie.year < year;
}); return beforeYear.map(function (movie) {
return `${movie.title}, ${movie.year}`;
});
}
고차 함수 작성 방식
- 메소드 체이닝 : function return을 이어서 작성하는 방법. 간결하게 표현할 수 있지만, filter와 map 사이에 오류가 나는 경우 처리가 어렵다는 단점이 있습니다.
function classicMovies(arr, year) {
return arr.filter(function (movie) {
return movie.year < year;
// filter에 이어 바로 map 실행.
}).map(function (filterMovie) {
return `${filterMovie.title}, ${filterMovie.year}`;
})
}
- 위 코드의 각 function을 함수 표현식으로 표현
// 함수 표현식
const classicMovies = function(arr, year) {
return arr.filter(filterMovies).map(mapMovies)
}
// 함수 표현식
const filterMovies = function (movie) {
return movie.year < year;
}
// 함수 표현식
const mapMovies = function (filterMovie) {
return `${filterMovie.title}, ${filterMovie.year}`;
}
- 각 메소드 호출 이후의 결과를 변수에 담아서 다음 메소드 호출 시 활용 방법. 이 방법은 다소 코드가 장황하다고 느껴질 수 있지만, filter와 map이 진행되는 중 어디서 오류가 나는지 보다 분명하게 확인할 수 있는 장점이 있다.
// 함수 선언식
function classicMovies(arr, year) {
// 함수 표현식
const beforeYear = arr.filter(function (movie) {
return movie.year < year;
});
// 함수 선언식
return beforeYear.map(function (movie) {
return `${movie.title}, ${movie.year}`;
});
}