1. 함수란?
- 함수는 일련의 과정을 문으로 구현하고 코드블록으로 감싸서 하나의 실행 단위로 정의한 것이다.
- 입력받는 변수를 매개변수(parameter), 입력을 인수(argument), 출력을 반환값이라 한다.
- 함수는 값이며 여러 개 존재할 수 있으므로 식별자인 함수 이름을 사용할 수 있다.
- 함수는 함수 정의를 통해 생성한다.
- 인수를 매개변수를 통해 함수에 전달하면서 함수의 실행을 명시적으로 지시해야하는데, 이를 함수의 호출이라 한다.
2. 함수를 사용하는 이유
- 함수는 코드의 재사용측면에서 매우 유용하다 (여러번 호출할 수 있기 때문)
- 유지보수의 편의성을 높이고, 신뢰성을 높이는 효과가 있다.
- 함수이름을 적절히 짓는다면 코드의 가독성을 향상시킨다.
3. 함수 리터럴
- 함수 리터럴은 function키워드, 함수 이름, 매개변수 목록, 함수 몸체로 구성된다.
- 함수이름 : 식별자이다, 몸체 내에서만 참조할 수 있는 식별자이다, 함수이름은 생략할 수 있다
- 매개변수 목록: 함수를 호출할 때 지정한 인수가 순서대로 할당된다.
- 일반 객체는 호출할 수 없지만 함수는 호출할 수 있다.
4. 함수 정의
- 함수를 호출하기 전에 인수를 전달받을 매개변수와 실행할 문들, 반환할 값을 지정하는 것을 의미한다.
- 정의된 함수는 자바스크립트 엔진에 의해 평가되어 함수 객체가 된다.
- 변수는 선언, 함수는 정의한다고 한다.
4.1 함수 선언문
- 함수 선언문은 함수 리터럴과 형태가 같지만 함수선언문은 함수 이름을 생략할 수 없다.
- 함수 선언문은 표현식이 아닌 문이다.
- 표현식이 아닌 문은 변수에 할당할 수 없는데, 함수가 변수에 할당하는것처럼 보이는 이유는 함수를 선언문이 아니라 리터럴 표현식으로 해석할 경우가 있기 때문이다.
- 자바스크립트 엔진은 함수 리터럴을 단독으로 사용하면 함수 선언문으로 해석하고, 함수 리터럴이 값으로 평가되어야 하는 문맥이라면 리터럴 표현식으로 해석한다.
- 둘다 함수가 생성되는 것은 동일하나 내부 동작에 차이가 있다.
- 자바스크립트 엔진은 생성된 함수를 호출하기 위해 함수 이름과 동일한 이름의 식별자를 암묵적으로 생성하고, 거기에 함수 객체를 할당한다.
- 자바스크립트 엔진은 함수 선언문을 함수 표현식으로 변환해 함수 객체를 생선하는것..
4.2 함수 표현식
- 값의 성질을 갖는 객체를 일급 객체라 하고 자바스크립트의 함수는 일급 객체이다.
- 함수 리터럴로 생성한 함수 객체를 변수에 할당하는것을 함수 표현식이라 한다.
- 함수리터럴의 함수 이름은 생략할 수 있는데, 이를 익명 함수라 한다.
4.3 함수 생성 시점과 함수 호이스팅
- 함수 선언문으로 정의한 함수는 함수 선언문 이전에 호출할 수 있다
- 함수 표현식으로 정의한 함수는 표현식 이전에 호출할 수 없다.
- 선언문은 런타임 이전에 먼저 실행되기 때문에 호이스팅이 일어난다.
- 함수 표현식으로 함수를 정의하면 함수 호이스팅이 발생하는 것이 아니라 변수 호이스팅이 발생한다.
4.4 Function 생성자 함수
- new Function ('x','y', '실행할 문'); 방식으로 작성
- Function생성자 함수로 함수를 생성하는것은 일반적이지 않으며 바람직 하지도 않다.
- 클로저를 생성하지도 않고 다른 함수와 동일하게 동작ㅈ하지도 않기 때문이다.
4.5 화살표 함수
- () => {} 으로 정의
- 기존함수에 비해 표현만 간략화 된 것이 아니라 동작도 간략화 되었다.
- 화살표 함수는 생성자 함수로 사용할 수 없으며 this 바인딩 방식이 다르고, prototype 프로퍼티가 없으며 arguments 객체를 생성하지 않는다.
5. 함수 호출
- 함수를 호출하면 현재의 실행 흐름을 중단하고 호출된 함수로 실행 흐름을 옮긴다.
5.1 매개변수와 인수
- 함수 외부에서 내부로 값을 전달할 필요가 있을 경우 매개변수를 이용해 인수를 넘긴다.
- 인수의 개수와 타입에는 제한이 없다.
- 매개변수는 함수 몸체 내부에서만 참조할 수 있다.
- 매개변수의 개수는 인수의 개수와 일치하는지 체크하지 않는다.
- 매개변수보다 만은 인수는 암묵적으로 arguments객체의 프로퍼티로 보관된다.
- arguments 객체는함수를 정의할 때 매개변수 개수를 확정할 수 없는 가변 인자 함수를 구할 때 유용하게 사용된다.
5.2 매개변수의 최대 개수
- 명시적으로는 제한하고 있지 않다.
- 이상적인 함수는 한가지 일만 해야 하며 가급적 작게 만들어야 한다.
- 따라서 3개 이상을 넘지 않는 것을 권장한다.
5.3 반환문
- 함수의 실행 결과를 외부로 반환할 수 있다.
- 함수 호출은 표현식이다.
- 반환문은 함수의 실행을 중단하고 빠져나가는 역할과 표현식을 평가해 반환하는 역할을 한다.
6. 참조에 의한 전달과 외부 상태의 변경
- 객체의 변경을 추적하려면 옵저버 패턴 등을 통해 객체를 참조하고 공유하는 모든이들에게 변경 사실을 통지하고 대처하는 추가 대응이 필요하다.
- 이런 문제의 해결방법 중 하나는 객체를 불변객체로 만들어 사용하는 것이다.
- 깊은복사를 통해 새로운 객체를 생성하고 재할당을 통해 교체하면 외부 상태가 변화는 효과를 없앨 수 있다.
- 외부 상태를 변경하지 않고 외부 상태에도 의존하지 않는 함수를 순수 함수라 한다.
- 순수 함수를 통해 프로그래밍을 하려는 패러다임을 함수형 프로그래밍이라 한다.
7. 다양한 함수의 형태
7.1 즉시 실행 함수
- 함수 정의와 동시에 즉시 호출되는 함수이다.
- 단 한번만 호출되며 다시 호출할 수 없다.
- 익명함수를 사용하는 것이 일반적이다.
- 즉시 실행 함수는 그룹 연산자 (...) 로 감싸야 한다.
- 그룹 연산자로 함수를 묶는 이유는 함수 리터럴을 평가해 함수객체를 생성하기 위해서이다.
7.2 재귀 함수
- 함수가 자기 자신을 호출하는것을 재귀 호출이라 한다.
- 재귀 함수는 자신을 무한 호출하기 때문에 탈출 조건을 반드시 만들어야 한다.
7.3 중첩 함수
- 함수내부에 정의한 함수를 중첩함수 또는 내부함수라고 한다.
- 일반적으로 중첩함수는 외부 함수를 돕는 헬퍼 함수의 역할을 한다.
7.4 콜백 함수
- 함수의 매개변수를 통해 다른함수의 내부로 전달되는 함수를 콜백 함수라 하며, 매개 변수를 통해 함수의 외부에서 콜백함수를 전달받은 함수를 고차 함수라고 한다.
- 매개변수를 통해 함수를 전달받거나 반환값으로 함수를 전달하는 함수를 고차함수라고 한다.
- 고차함수는 매개변수를 통해 전달받은 콜백 함수의 호출 시점을 결정해 호출한다.
- 콜백 함수가 고차함수 내부에서만 호출된다면 콜백 함수를 익명 함수 리터럴로 정의하면서 인자로 주는것이 일반적이다.
- 콜백함수로 전달된 함수 리터럴은 고차 함수가 호출될 때마다 평가되어 함수 객체를 생성한다.
7.5 순수 함수와 비순수 함수
- 어떤 외부상태에도 의존하지 않고 변경하지도 않는 함수를 순수 함수라 하고, 외부 상태에 의존하거나 변경하는 힘수를 비순수 함수라 한다.
- 순수 함수는 동일한 인수가 전달되면 언제나 동일한 값을 반환하는 함수이다.
- 순수 함수는 어떠한 외부상태에 의존하지 않으며 변경하지도 않는다.
- 비순수함수를 최대한 줄이는것이 부수효과를 최대한 억제하는 것이다.
- 함수형 패러다임은 순수함수의 조합을 통해 불변성을 지향하는 프로그래밍 패러다임이다.
'JS > [책] 모던 자바스크립트 Deep Dive' 카테고리의 다른 글
14. 전역 변수의 문제점 (0) | 2021.08.26 |
---|---|
13. 스코프 (0) | 2021.08.26 |
11. 원시 값과 객체의 비교 (0) | 2021.08.23 |
10. 객체 리터럴 (0) | 2021.08.19 |
9. 타입 변환과 단축 평가 (0) | 2021.08.19 |