고차함수는 다른 함수를 인수로 받아들이고 함수를 출력으로 반환하는 함수입니다.
JavaScript 함수는 언어의 다른 데이터 유형처럼 작동합니다. 따라서 변수에 함수를 할당할 수 있고, 그것을 새로운 변수에 재할당할 수 있습니다.
const announceThatIAmDoingImportantWork = () => {
console.log("I’m doing very important work!");
};
위 코드는 함수의 이름이 길어 코드의 가독성을 해칩니다. 그렇다면 우리는 위에서 말했던 것처럼 함수를 변수에 할당하는 방법을 이용할 수 있습니다.
const busy = announceThatIAmDoingImportantWork;
busy();
busy는 원래 함수 announceThatIAmDoingImportantWork를 참조하는 변수입니다. 기존의 함수 이름과 새로운 busy는 같은 주소를 가리키고, busy()를 사용하여 기존 함수를 호출할 수 있습니다. 기존 함수 이름을 새로운 변수에 할당하고자 했을 때 괄호 없이 할당합니다.
JavaScript는 퍼스트 클래스 객체입니다. 즉, 다른 객체와 마찬가지로 속성과 메서드를 갖습니다. 아래 링크를 통해 더 자세히 볼 수 있습니다.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function
JavaScript의 함수는 다른 데이터 유형처럼 동작하기 때문에 함수를 매개변수로 전달할 수 있습니다. 매개변수를 통해 함수의 외부에서 함수를 인수로 전달받은 함수를 고차 함수, 매개변수를 통해 다른 함수의 내부로 전달되는 함수를 콜백 함수라고 합니다. 인수로 함수를 다른 함수에 전달할 땐, 괄호 없이 함수 이름을 입력하여 함수 자체를 전달합니다.
const timeFuncRuntime = funcParameter => {
let t1 = Date.now();
funcParameter();
let t2 = Date.now();
return t2 - t1;
}
const addOneToOne = () => 1 + 1;
timeFuncRuntime(addOneToOne);
위 예시는 고차함수 timeFuncRuntime()을 작성한 것으로 함수를 인수로 받아들여 timeFuncRuntime()의 시작 시간을 t1에 저장하고, 콜백 함수를 호출한 후 시간 기록 후, 콜백 함수의 종료 시간을 t2에 저장해 함수 실행하는데 걸린 시간을 반환합니다. 이후 addOneToOne 인수로 받아 timeFuncRuntime 함수를 호출했습니다.
timeFuncRuntime(() => {
for (let i = 10; i>0; i--){
console.log(i);
}
});
익명 함수를 이용할 수도 있습니다. 위 예시는 익명 함수를 timeFuncRuntime() 함수의 인수로 넘겨 사용한 예입니다.
배열 안을 반복적으로 훑어 내려가면서 필요한 작업을 수행하는 메서드입니다.
.forEach()는 배열의 요소 각각(for each)에 대해 동일한 코드를 실행하는 메서드입니다.
.forEach()에 대해 콜백을 전달하는 또 다른 방법은 화살표 함수 구문을 사용하는 것입니다.
groceries.forEach(groceryItem => console.log(groceryItem));
콜백 함수로 사용할 함수를 미리 정의할 수도 있습니다.
function printGrocery(element){
console.log(element);
}
groceries.forEach(printGrocery);
위의 예는 함수 선언을 사용하지만 함수 표현식 혹은 화살표 함수도 사용할 수 있습니다.
세 개의 코드 모두 동일한 작업을 수행합니다. 각 배열 반복 방법에서 3가지 예시 중 하나를 사용해 콜백 함수를 반복자에 대한 인수로 제공할 수 있습니다.
.map()은 .forEach()와 원리는 동일하나, 결과로 새로운 배열을 반환합니다.
const numbers = [1, 2, 3, 4, 5];
const bigNumbers = numbers.map(number => {
return number * 10;
});
console.log(numbers); // Output: [1, 2, 3, 4, 5]
console.log(bigNumbers); // Output: [10, 20, 30, 40, 50]
기존의 numbers의 요소는 변경되지 않았으며, bigNumbers라는 새 배열이 생성됐습니다.
.filter()는 .map()과 마찬가지로 새 배열을 반환합니다. 그러나 .filter()는 원래 배열에서 특정 요소를 필터링한 후 요소 배열을 반환합니다. .filter() 메서드에서 콜백 함수는 전달된 요소에 따라 true 혹은 false를 반환해야 합니다. 콜백 함수가 true를 반환하도록 하는 요소가 새 배열에 추가됩니다.
const words = ['chair', 'music', 'pillow', 'brick', 'pen', 'door'];
const shortWords = words.filter(word => {
return word.length < 6;
});
console.log(words); // Output: ['chair', 'music', 'pillow', 'brick', 'pen', 'door'];
console.log(shortWords); // Output: ['chair', 'music', 'brick', 'pen', 'door']
콜백 함수에 의해 true로 판정된 최초 요소의 index를 반환합니다. 만약 만족하는 결과값이 없으면 -1을 반환합니다.
const jumbledNums = [123, 25, 78, 5, 9];
const lessThanTen = jumbledNums.findIndex(num => {
return num < 10;
});
console.log(lessThanTen); // Output: 3
console.log(jumbledNums[3]); // Output: 5
const greaterThan1000 = jumbledNums.findIndex(num => {
return num > 1000;
});
console.log(greaterThan1000); // Output: -1
만약 조건을 충족하는 요소가 배열에 없다면, -1을 반환합니다.
.reduce()는 배열의 모든 요소들을 앞에서부터 순차적으로 함수를 적용시켜, 최종 값 1개를 반환합니다.
const numbers = [1, 2, 4, 10];
const summedNums = numbers.reduce((accumulator, currentValue) => {
return accumulator + currentValue
})
console.log(summedNums) // Output: 17
const numbers = [1, 2, 4, 10];
const summedNums = numbers.reduce((accumulator, currentValue) => {
return accumulator + currentValue
}, 100) // <- Second argument for .reduce()
console.log(summedNums); // Output: 117
.reduce() 메서드는 두 번째 매개변수를 사용하여 accumulator의 초기값을 설정할 수 있습니다.
더 많은 기본 제공 배열 방법이 있으며, 다음 페이지를 통해 확인할 수 있습니다.
Corner React Starter #1
Editor 알밤
리액트를 다루는 기술 - 1장. 리액트 시작 (0) | 2021.11.01 |
---|---|
[Javascript] Codecademy 8. Objects (0) | 2021.10.11 |
[Javascript] Codecademy 6. Loops (0) | 2021.10.11 |
[Javascript] Codecademy 5. Array (0) | 2021.10.04 |
[Javascript] Codecademy 4. Scope (0) | 2021.10.04 |