
함수란 코드의 덩어리를 만든 다음 그것을 호출하고 반환시키는 구조를 말합니다. 복잡한 코드를 관리할 수 있게 만들어 줍니다. 자바스크립트의 함수에 대한 몇 가지 토픽을 정리하고 가겠습니다.
parameter(매개변수): 함수를 정의할때 넣는 변수.
argument(인수 or 인자) : 함수를 정의하고 나서 호출할때 실제로 넣는 값.
function add(a,b) { //a,b는 매개변수
return a+b
}
add(1,2) //1,2는 인수
자바스크립트에서 함수는 일급 시민(first class citizen)입니다. 일급 시민이란 변수에 함수를 넣을 수 있다는 뜻입니다. 변수에 넣을 수 있기 때문에 함수의 리턴 값이나 인수로 사용 가능합니다.
const firstClass = function(a,b) {
return a+b
}
// function declaration
function calcAge(birthYear) {
return 2037 - birthYear;
}
// function expression
const calcAge = function (birthYear) {
return 2037 - birthYear;
};
앞서 말했듯이 자바스크립트에서는 함수를 변수로 쓸 수 있습니다. 이런 형태를 함수 표현식이라 합니다. (function expression) let이나 const로 선언한다면 호이스팅을 막아 코드를 좀 더 예측 가능하게 작성 할 수 있습니다.
고차 함수는 다른 함수를 다른 함수를 리턴하는 함수 혹은 매개변수로 받는 함수를 말합니다.
function count() {
let counter = 0
return function() { // <= 다른함수 리턴
counter++
}
}
콜백 함수는 다른 함수의 매개변수로 전달되는 함수를 말합니다.
const greet = () => console.log(" Hey Tom"); // <= 콜백함수
btnClose.addEventListener("click", greet); //<= 매개변수 자리에 콜백함수를 넣는 고차함수.
어떤 함수가 순수 함수라면 다음의 조건을 만족해야 합니다.
- 부수효과(side effect)가 없어야 한다 .
외부 변수에 의존하지 않아야 한다.
콜백 함수로 구현되었거나 콜백함수를 사용하는 코드가 없다.
* Promise와 같이 비동기 방식으로 동작하는 코드가 없다.
// side-effect가 있는 함수
const array = [1, 2, 3]
function addElement(arr, element) {
arr.push(element)
return arr
}
// side-effect가 없도록 고친 함수
const array = [1, 2, 3]
function addElement(arr, element) {
return [...arr, element]
}
//외부의 값을 복사해 와서 새로운 값 리턴
부수효과(side effect)란 함수 외부의 값을 변경시키는 것을 말합니다. 어떤 함수가 순수 함수라면 함수가 함수 외부의 값을 변경시키면 안 됩니다.
// 외부 변수에 의존하는 함수
const TAX_RATE = .07
function calculateTax(price) {
return price * TAX_RATE
}
// 수정
const TAX_RATE = .07
function calculateTax(price, taxRate) {
return price * taxRate
}
외부 변수에 의존하지 않는다는 것은 함수의 리턴 값은 오직 입력한 인수에 의해 결정된다는 것입니다. 만약 입력한 값이 같다면 항상 같은 값을 반환하게 됩니다. 항상 순수 함수를 쓸 수는 없지만 순수 함수를 이용한다면 코드가 더 예측 가능해집니다.
결론: 자바스크립트의 함수는 변수에 집어넣을수 있다 그렇기 때문에 콜백함수 고차함수등을 이용할 수 있고, 순수함수를 이용한다면 좀 더 예측가능하게 코딩할 수 있다.
참고자료:
Do it! 타입스크립트 프로그래밍
What Are Pure Functions?
The complete javascript course -Jonas Schmedtmann-