all is well!!
15. 다양한 JS 함수의 형태 본문
함수형 프로그래밍은 불변성을 지향하는 프로그래밍 패러다임으로 아래 3가지를 목표로 한다.
1. 조건문과 반복문을 제거해 복잡성을 해결하고 변수 사용을 억제
2. 변수 사용을 억제
3. 생명주기를 최소화해서 상태 변경을 피해 오류를 최소화
👀 즉시 실행 함수
1. 즉시 실행 함수는 함수 정의와 동시에 즉시 호출된다.
(function (){
var a = 3;
var b = 5;
return a * b;
}());
2. 단 한번만 호출되고 다시 호출할 수 없다.
3. 익명 함수(이름없는 함수)를 사용하는 것이 일반적이다.
4. 기명 즉시 실행 함수(이름있는 함수)도 사용하능 하지만 그룹 연산자()안의 기명 함수는 함수 리터럴로 평가되고
함수 이름은 함수 몸체에서만 참조할 수 있기 때문에 다시 호출할 수는 없다.
// 가장 일반적인 즉시실행함수 방식
(function foo(){
var a = 3;
var b = 5;
return a * b;
}());
foo(); // foo is not defined
5. 즉시 실행 함수는 그룹연산자()로 감싸야 한다.
그 이유는 함수 리터럴을 평가해서 함수 객체를 생성하기 위해서다.
6. 즉시 실행 함수는 아래 예시처럼 값을 반환하거나 인수를 전달할 수 있다.
👀 재귀 함수
1. 함수가 자기 자신을 호출하는 것을 재귀 호출이라고 한다. 재귀 함수는 이런 재귀 호출을 수행하는 함수다.
2. 재귀 함수는 반복되는 처리를 위해 사용한다.
function countdown(n){
if (n<0) return;
console.log(n);
countdown(n-1); // 재귀 호출
}
countdown(10);
이렇게 반복문 없이 재귀함수를 사용할 수 있다.
3. 재귀 함수는 자기자신을 무한으로 호출을 한다. 그래서 탈출조건을 무조건 만들어야 한다.
4. 탈출조건이 없으면 스택 오버플로 에러가 발생한다.
5. 재귀 함수는 반복문보다 직관적으로 이해하기 쉬운 상황일때만 사용하는게 좋다.
👀 중첩 함수
1. 함수 내부에 정의된 함수를 중첩 함수 또는 내부 함수라고 한다.
2. 중첩 함수를 포함한 함수는 외부 함수라고 한다.
3. 중첩 함수는 외부 함수 내부에서만 호출 가능하고 외부 함수의 헬퍼 함수 역할을 한다.
4. ES6부터는 if문이나 for문 등의 코드 블록 내에서도 정의할 수 있다.
5. 호이스팅 때문에 if문이나 for문등 코드 블록에서 함수 선언문을 사용하는것은 좋지 않다.
6. 중첩함수는 스코프와 클로저와 관련이 있다.
👀 콜백 함수
1. 함수의 매개변수를 통해 다른 함수의 내부로 전달되는 함수.
2. 매개변수를 통해 함수의 외부에서 콜백 함수를 전달받은 함수를 고차 함수라고 한다.
3. 콜백 함수는 고차 함수에 전달되서 헬퍼 함수 역할을 한다.
4. 콜백 함수는 함수 외부에서 고차 함수 내부로 주입하기 때문에 자유롭게 교체 가능하다.
5. 콜백함수는 고차 함수에 의해 호출되고 고차함수는 필요에 따라 콜백 함수에 인수를 전달할 수 있다.
6. 콜백 함수가 고차 함수 내부에만 호출되면 익명 함수 리터럴로 정의하면서 바로 고차 함수에 전달하는것이 일반적이다.
repeat(5, function(i){
if(i%2) console.log(i);
}; // 1 3
이때 콜백 함수로 전달된 익명 함수는 고차 함수가 호출될때마다 평가되서 함수 객체를 생성한다.
콜백 함수를 다른곳에서 호출하거나 콜백 함수를 전달받는 함수가 자주 호출되는 경우
맨 위의 예시처럼 함수 외부에서 콜백 함수를 정의해서 함수 참조를 고차 함수에 전달하는것이 좋다.
7. 함수형 프로그래밍 뿐만아니라 비동기 처리에 활용되는 중요한 패턴.
8. map이나 filter같은 배열 고차 함수에도 사용된다.
👀 순수 함수와 비순수 함수
🟣 순수 함수
1. 외부 상태에 의존하지도, 변경하지도 않는 함수.
2. 오직 매개변수를 통해 함수 내부로 전달된 인수에게만 의존해 값을 생성한다.
3. 함수 내부 상태에만 의존해도 내부 상태가 호출될 때마다 변하는 현재시간 같은 값이면 순수함수가 아니다.
4. 인수를 전달받지 않으면 상수와 마찬가지여서 의미가 없기때문에 최소 하나이상의 인수를 전달받는다.
5. 인수를 변경하지 않고 불변성을 유지한다.
🟣 비순수 함수
1. 외부 상태에 의존하거나 외부 상태를 변경하는 함수.
2. 함수 내부에서 외부 상태를 직접 참조하면 외부 상태에 의존하기 때문에 반환값이 변하고 외부 상태도 변경되기 때문에 비순수 함수다.
3. 매개변수로 객체를 전달받아도 비순수 함수가 된다.
4. 함수가 외부 상태를 변경하면 상태 변화를 추적하기 힘들기 때문에 비순수 함수를 지양하는것이 좋다.
'Javascript 공부' 카테고리의 다른 글
17. 전역 변수의 문제점 (0) | 2023.07.29 |
---|---|
16. 스코프 (0) | 2023.07.22 |
14. JS 함수 (0) | 2023.07.21 |
13. 원시 값과 객체의 비교 (0) | 2023.07.15 |
12.객체 리터럴 (0) | 2023.07.15 |