12.5 . 함수호출
function add(x,y) {
return x+y ;
}
console.log(add(2)); // NAN
console.log(add('a','b')); // 'ab'
위 코드는 js 문법상 어떤 문제가 없음
자바스크립트 엔진의 특징
1. 자바스크립트 함수는 매개변수와 인수의 개수가 일치하지 확인하지 않는다.
2.자바스크립트는 동적타입언어이다. 따라서 자바스크립트 함수는 매개변수의 타입을 사전에 지정 할수없다.
따라서 js의 경우 함수를 정의할때 적절한 인수가 전달되어있는지 확인할 필요가 있다. -> ts를 적극적으로 써야하는 이유가 더생긴듯하다.
책에서는 typeof 로 판단을 한다.
매개변수의 최대 개수
매개변수의 개수는 0개 , 적을수록 좋다. 책에서는 최대 3개이상을 넘지 않을것을 권장한다.
그이상의 매개변수가 필요하다면 객체를 인수로 전달하는 것을 권장한다
다만 주의할점은 함수 외부에서 함수 내부로 전달한 객체를 함수내부에서 변경하면 함수 외부의 객체가 변경되는 부수효과 (사이드이펙트) 가 발생한다.
매개변수의 개수가 많다는 것은 함수가 여러 가지 일을 한다는 증거이므로 바람직하지 않다.
이상적인 함수는 한가지 일만 해야하며 , 가급적 작게 만들어야한다.
-> 동의하는부분. 작은함수이고 직관적인 함수명을 가진함수일수록 한눈에 보기 쉽다. 그렇지 않은 함수는 한줄한줄 해석해야만한다 ..
참조에 의한 전달과 외부 상태의 변경
number , string같은 원시타입은 값자체가 복사되어 매개변수에 전달되기 때문에 함수 내부에서 그값을 변경하여도 원본이 훼손 되지 않는다. 즉 , 부수효과가 없음 (사이드이펙트가 없음)
하지만 객체타입은 참조값이 복사되어 매개변수에 전달되기 때문에 함수 내부에서 참조값을 통해 객체를 변경할 경우 원본이 훼손된다.
즉 , 부수효과가 있다 (사이드이펙트 발생)
이를 해결할수있는 방법 중 하나는 객체를 불변객체로 만들어서 사용하는 것이다.
원본 객체를 완전히 복제 (깊은복사) 를 통해 새로운 객체를 생성하고 재할당을 통해 교체한다. 이를 통해 부수효과(사이드이펙트)를 없앨수있다.
외부 상태를 변경하지 않고 외부 상태에 의존하지도 않는 함수를 순수함수라한다.
이런 순수함수를 통해 부수효과를 최대한 억제하고 오류를 피하고 프로그램의 안정성을 높이려는 프로그래밍 패러다임을 함수형 프로그램밍이라 한다.
12.7 . 다양한 함수의 형태
1. 즉시 실행함수
- 한번만 호출되며 다시 호출불가.
2. 재귀함수
자기자신을 호출하는 함수.
반복되는 처리를 위해 사용한다 ex) 10 부터 0 까지 출력하는 함수 구현
// NOTE: 일반 for문
const countDown = (value) => {
for (let i = value; i >= 0; i--) {
console.log(i);
}
};
// NOTE: 재귀 함수
const countDownSecond = (value) => {
if (value < 0) {
return;
}
console.log("value", value);
countDownSecond(value - 1); // 재귀호출
};
countDown(10);
countDownSecond(10);
3. 중첩함수
함수안에 함수가 있는 함수
4. 콜백함수
함수의 매개변수를 통해 다른함수의 내부로 전달되는 함수
5. 고차함수
매개변수를 통해 함수의 외부에서 콜백함수를 전달받은 함수를 고차함수라 한다
고차함수는 콜백함수를 자신의 일부분으로 합성한다.
고차 함수는 매개변수를 통해 전달받은 콜백함수의 호출시점을 결정해서 호출한다.
즉, 콜백함수는 고차함수의 의해 호출된다. 이때 고차함수는 필요에 따라 콜백함수에 인수를 전달 할 수있다.
6. 순수 & 비순수함수
부수효과가 없는함수 = 순수함수
부수효과가 있는함수 = 비순수함수
순수함수의 원칙은 동일한 인수가 전달되면, 언제가 동일한값을 반환하는 함수이다.
순수함수는 함수의 외부 상태를 변경하지 않는다.
즉, 순수함수는 어떤 외부 상태에도 의존하지 않으며 , 외부 상태를 변경하지도 않는 함수이다.
'JavaScript > 모던자바스크립트 딥다이브' 카테고리의 다른 글
[딥다이브] 17장 생성자 함수에 의한 객체생성 (0) | 2022.03.09 |
---|---|
[딥다이브] 16장 프로퍼티 어트리뷰트 (0) | 2022.03.09 |
[딥다이브] 15장 let, const 키워드와 블록레벨 스코프 (0) | 2022.02.22 |
[딥다이브] 14장 전역변수의 문제점 (0) | 2022.02.21 |
[딥다이브] 13장 스코프 (0) | 2022.02.14 |