티스토리 뷰
12 함수
함수 : 자바스크립트에서 가장 중요한핵심 개념
(다른 핵심개념 스코프, 실행컨텍스트. 클로저, 생성자 함수에 의한 객체 생성, 메서드, this, 프로토 타입, 모듈화)
프로그래밍 언어의 함수는 일련의 과정을 문으로 구현하고 코드 블록으로 감싸서 하나의 실행 단위로 정의한 것
함수 내부로 입력을 전달받는 변수를 매개변수, 입력을 인수, 출력을 반환값이라 함
함수는 함수 정의를 통해 생성하며, 다양한 방법으로 정의할 수 있다.
함수 정의만으로 함수가 실행되는 것은 아니고 함수 호출이 필요함
함수를 사용하는 이유 : 함수는 몇 번이든 호출 할 수 있으므로 코드의 재사용 측면에서 유용함
=> 코드의 중복을 억제하고, 재사용성을 높이는 함수는 유지보수의 편의성을 높이고 실수를 줄여 코드의 신뢰성을 높이는 효과가 있음. 함수는 객체 타입이라 이름을 붙일 수 있어 코드의 가독서을 향상시킴
함수 리터럴 : function 키워드, 함수 이름, 매개변수 목록, 함수몸체
* 리터럴 = 사람이 이해할 수 있는 문자 또는 약속된 기호를 사용해 값을 생성하는 표기 방식
일반 객체는 호출할 수 없지만, 함수는 호출할 수 있다는 차이가 있으며 함수가 객체라는 사실은 다른 프로그래밍 언어와 구별되는 자바스크립트의 중요한 특징임
함수 정의 방법은 4가지가 있다
선언문 : 함수 리터럴과 형태가 동일하다. 단 리터럴은 함수 이름을 생략할 수 있으나 함수선언문은 함수 이름을 생략할 수 없다.
function add(x, y) { return x + y; } // add 생략 불가능
선언문은 표현식이 아닌 문이다! == 변수에 할당할 수 없지만 변수에 할당되는 것 처럼 보여진다.
var add = function add(x, y) { return x + y ; } ;
== 동일한 형태인 함수 리터럴을 표현식이 아닌 문인 함수 선언문으로 해석하는 경우가 있기 때문
기명 함수 리터럴은 함수 선언문과 달리 호출할 수 없다.
js 엔진은 생성된 함수를 호출하기 위해 함수 이름과 동일한 이름의 식별자를 암묵적으로 생성하고, 거기에 함수 객체를 할당한다. 즉, 함수는 함수 이름으로 호출하는 것이 아니라 함수 객체를 가리키는 식별자로 호출한다.
함수표현식 : js함수는 객체타입의 값이다. js 함수는 값처럼 변수에 할당할 수도 있고 프로퍼티 값이 될수도 있으며 배열의 요소가 될 수도 있다. 이처럼 값의 성질을 갖는 객체를 일급객체라고 하며 js 함수는 일급 객체다.
var add = function (x, y) { return x + y; }; >> 함수 이름을 생략하는 것이 일반적이다!
함수 선언문 = 표현식이 아닌 문이고 함수 표현식 = 표현식인 문
함수 생성 시점과 함수 호이스팅:
함수 선언문으로 정의한 함수와 함수 표현식으로 정의한 함수의 생성 시점이 다름, 선언문으로 정의한 함수는 호이스팅되지만 표현식으로 정의한 경우는 호이스팅되지 않음(선언문으로 정의한 함수는 런타임 이전에 객체가 생성되기때문에)
변수 할당문의 값은 할당문이 실행되는 시점, 즉 런타임에 평가되므로 함수 표현식의 함수 리터럴도 할당문이 실행되는 시점에 평가되어 함수 객체가 됨. 따라서 함수 표현식으로 함수를 정의하면 함수 호이스팅이 발생하는 것이 아니라 변수 호이스팅이 발생함.
Function 생성자 함수
생성자 함수는 객체를 생성하는 함수를 말함
var add = new Function('x', 'y', 'return x + y');
Function 생성자 함수로 함수 생성하는 방식은 일반적이지도 않고 바람직하지도 않음.
화살표 함수 : ES6에서 도입된 화살표 함수, 항상 익명 함수로 정의함
const add = (x, y) => x+y;
: 생성자 함수로 사용 불가, this 바인딩 방식이 다름, 프로퍼티가 없으며 argument 객체를 생성하지 않음
함수 호출 : 함수는 매개변수의 개수와 인수의 개수가 일치하는지 체크하지 않는다. 인수가 모자란 경우 undefined로 초기화된 상태 그대로 이며 undefined로 연산되는 경우 NaN이 반환된다.
인수확인 : 어떤 타입의 인수를 전달해야하는 지 명시할 수 없으므로 이를 체크하는 로직을 넣어두는 작업이 필요함
매개변수의 최대개수 : 이상적인 함수는 한 가지 일만 해야하하며 가급적 작게 만들어야 함, 매개변수는 최대 3개 이상을 넘지 않는 것을 권장함
반환문 : return키워드와 표현식(반환값)으로 이뤄진 반환문을 사용해 실행 결과를 함수 외부로 반환할 수 있다. 함수 호출은 표현식이다! 반환문은 함수 실행을 중단하고 함수 몸체를 빠져나가는 역할을 하고, return 뒤에 오는 표현식을 평가해 반환하는 역할을 함. 표현식을 명시적으로 지정하지 않으면 undefined가 반환됨
전역에서 return을 사용하면 문법 에러가 발생함
참조에 의한 전달과 외부 상태의 변경
: 객체 상태 변경을 원천봉쇄하고 객체의 상태 변경이 필요한 경우에는 객체의 방어적 복사를 통해 원본 객체를 완전히 복제 즉 깊은 복사를 통해 새로운 객체를 생성하고 재할당을 통해 교체한다.
다양한 함수의 형태:
- 즉시 실행 함수 : 단 한 번만 호출되며 다시 호출할 수 없다. 익명 함수를 사용하는 것이 일반적이고 반드시 그룹 연산자 (...)로 감싸야함 ( function () {}());
- 재귀 함수 : 자기 자신을 호출하는 함수, 반복처리를 위해 사용함
- 중첩합수 : 함수 내부에 정의된 함수, 내부함수라고 함. 중첩함수를 포함하는 함수를 외부함수라고 함
- 콜백함수 : 함수의 매개변수를 통해 다른 함수의 내부로 전달되는 함수를 콜백 함수라고 하며, 매개변수를 토해 함수의 외부에서 콜백 함수를 전달받은 함수를 코차함수라고 한다. 고차 함수는 콜백 함수를 자신의 일부분으로 합성함.
콜백함수는 고차함수에 의해 호출되며, 이때 고차 함수는 필요에 따라 콜백 함수에 인수를 전달할 수 있다.
콜백함수는 함수형 프로그래밍 뿐 아니라 비동기 처리(이벤트 처리, Ajax통신, 타이머 함수 등)에 활용되는 중요 패턴이다.
순수함수는 어떤 외부 상태에도 의존하지 않으며 외부 상태를 변경하지도 않는 함수다.
함수의 외부 상태에 따라 반환값이 달라지는 함수, 다시 말해 외부 상태에 의존하는 함수를 비순수 함수라고 한다.
비순수 함수의 또 하나의 특징은 순수 함수와 달리 외부 상태를 변경하는 부수 효과가 있다.
== 비순수 함수는 외부 상태에 의존하거나 외부 상태를 변경하는 함수다.
인수를 전달받지 않아도 함수 내부에서 외부 상태를 직접 참조하면 비순수 함수가 된다.
== 함수형 프로그래밍은 순수 함수를 통해 부수 효과를 최대한 억제해 오류를 피하고 프로그램의 안정성을 높이려는 노력의 일환이라고 할 수 있다!