JS/[책] 모던 자바스크립트 Deep Dive

12. 함수

배워도끝이없네 2021. 8. 23. 14:57

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