프로그래밍 언어의 함수는 일련의 과정을 문(statement)으로 구현하고 코드 블록으로 감싸서 하나의 실행 단위로 정의한 것입니다. 프로그래밍 언어의 함수도 입력을 받아서 출력을 내보냅니다.
// 함수 정의functionadd(x, y) {
return x + y;
}
add(2, 5) // 함수 호출
함수 리터럴
// 변수에 함수 리터럴을 할당var f = functionadd(x, y) {
return x + y;
};
함수 정의
함수 선언문
functionadd(x, y) {
return x + y;
}
함수 표현식
var add = function(x, y) {
return x + y;
};
Function 생성자 함수
var add = newFunction('x', 'y', 'return x+y');
화살표 함수(ES6)
var add = (x,y) => x + y;
1. 함수 선언문
함수 선언문은 표현식이 아닌 문입니다. 크롬 개발자 도구의 콘솔에서 함수 선언문을 실행하면 완료 값 undefined가 출력됩니다다.
함수 선언문이 만약 표현식인 문이라면 완료 값 undefined 대신 표현식이 평가되어 생성된 함수가 출력되어야 합니다.
자바스크립트 엔진은 함수를 호출하기 위해 함수 이름과 동일한 이름의 식별자를 암묵적으로 생성하고, 거기에 함수 객체를 할당합니다.
var add = function(x, y) {
return x + y;
};
함수는 함수 이름으로 호출하는 것이 아니라 함수 객체를 가리키는 식별자로 호출합니다.
2. 함수 표현식
값의 성질을 갖는 객체를 일급 객체라 합니다. 자바스크립트의 함수는 일급 객체입니다. 함수가 일급 객체라는 것은 함수를 값처럼 자유롭게 사용할 수 있다는 의미입니다.
함수 표현식의 함수 리터럴은 함수 이름을 생략하는 것이 일반적입니다.
자바스크립트 엔진은 함수 선언문의 함수 이름으로 식별자를 암묵적으로 생성하고 생성된 함수 객체를 할당하므로 함수 표현식과 유사하게 동작하는 것처럼 보이지만 함수 선언문과 표현식이 정확히 동일하게 동작하지는 않습니다.
함수 선언문은 "표현식이 아닌 문"이고 함수 표현식은 "표현식인 문"이기 때문입니다.
바로 위 두개의 문은 생성 시점이 다릅니다.
함수 선언문 이전에 함수를 참조할 수 있으며 호출할 수도 있습니다.
함수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징을 함수 호이스팅이라 합니다.
함수 표현식으로 함수를 정의하면 함수 호이스팅이 발생하는 것이 아니라 변수 호이스팅이 발생합니다.
함수 호이스팅은 함수를 호출하기 전에 반드시 함수를 선언해야 한다는 당연한 규칙을 무시합니다. 이 같은 문제 때문에 더글라스 크락포드(JavaScript: The Good Parts 저자, JSON을 창안)는 함수 선언문 대신 함수 표현식을 사용하는 것을 권장합니다.
3. 함수 호출
매개변수와 인수
functionadd(x, y) { // x, y 매개변수return x + y; // x, y 반환값
}
var result = add(2, 5); // 2, 5 인수
함수를 호출할 때 매개변수의 개수만큼 인수를 전달하는 것이 일반적이지만 그렇지 않은 경우에도 에러가 발생하지는 않습니다.
인수가 부족해서 인수가 할당되지 않는 매개변수의 값은 undefined입니다.
functionadd(x,y) {
return x + y;
}
console.log(add(2)); // NaN
콜백 함수가 고차 함수 내부에만 호출된다면 콜백 함수를 익명 함수 리터럴로 정의하면서 곧바로 고차 함수에 전달하는 것이 일반적이다.
repeat(5, function (i) {
if(i % 2) console.log(i);
});
9. 순수 함수과 비순수 함수
부수 효과가 없는 함수를 순수 함수라하고, 외부 상태에 의존하거나 외부 상태를 변경하는, 즉 부수 효과가 있는 함수를 비순수 함수라고 합니다.
순수 함수는 인수의 불변성을 유지합니다. 즉 어떤 외부 상태에도 의존하지 않으며 외부 상태를 변경하지도 않는 함수입니다.
반대로 함수의 외부 상태에 따라 반환값이 달라지는 함수, 다시 말해 외부 상태에 의존하는 함수를 비순수 함수라고 합니다.
함수형 프로그래밍은 순수 함수와 보조 함수의 조합을 통해 외부 상태를 변경하는 부수 효과를 최소화해서 불변성을 지향하는 프로그래밍 패러다임입니다. 로직 내에 존재하는 조건문과 반복문을 제거해서 복잡성을 해결하며, 변수 사용을 억제하거나 생명주기를 최소화해서 상태 변경을 피해 오류를 최소화하는 것을 목표로 합니다.
함수형 프로그래밍은 결국 순수 함수를 통해 부수 효과를 최대한 억제해 오류를 피하고 프로그램의 안정성을 높이려는 노력의 일환이라 할 수 있습니다. 자바스크립트는 멀티 패러다임 언어이므로 객체지향 프로그래밍뿐만 아니라 함수형 프로그래밍을 적극적으로 활요하고 있습니다.
10. 이 책이 좋은 이유
자바스크립트 프로그래밍 언어에 대해서 정말 깊이 있게 잘 설명되어 있는 것은 기본이고, 어떤 게 좋은 코드인지 부연 설명과 Clean Code 책에서 보았던 내용들도 많이 언급되어 있어서 언어와 함께 좋은 코드를 같이 학습할 수 있어서 좋습니다!(내용이 많아서 두꺼운 건 비밀,,)