[모딥다] JS (2) - 함수
1. 함수란?
: 일련의 과정을 문으로 구현하고 코드 블록으로 감싸서 하나의 실행 단위로 정의한 것
: 매개변수 - 함수 내부로 입력을 전달 받는 변수
: 인수 - 입력
: 반환값 - 출력
: 함수 정의를 통해 생성
: 함수는 일급객체임 (값의 성질을 갖는 객체를 일급객체라고 함)
function addNumber(x,y) {
return x + y;
}
2. 함수 리터럴
: 함수는 객체 타입의 값이다 따라서 함수도 함수 리터럴로 생성할 수 있다.
: 함수 리터럴은 function 키워드, 함수 이름, 매개변수 목록, 함수 몸체로 구성된다.
var f = function add(x,y) {
return x + y;
};
* 함수 이름은 생략 가능, 이름이 없는 함수를 무명/ 익명 함수라 함
* 매개변수 목록은 식별자 네이밍 규칙을 준수해야 함
3. 함수 정의
1) 함수 선언문 - 함수 이름 생략 불가, 표현식이 아닌 문이기 때문에 완료값은 undefined가 출력됨
* 자바스크립트 엔진은 함수 선언문을 해석해 함수 객체를 생성한다.
=> 생성된 함수를 호출하기 위해 함수 이름과 동일한 이름의 식별자를 암묵적으로 생성하고, 거기에 함수 객체를 할당함
function addNumber(x,y) {
return x+y;
};
2) 함수 표현식
: 함수 선언문으로 정의한 함수는 함수 선언문 이전에 호출할 수 있으나 함수 표현식은 안됨.
=> 함수 선언문으로 정의한 함수와 함수 표현식으로 정의한 함수의 생성 시점이 다르기 때문이다.
* 함수 호이스팅 = 함수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징
* 변수 호이스팅은 할당문이 실행되는 시점인 런타임에 평가됨, 함수 표현식도 할당문이 실행되는 시점에 평가되어 함수 객체가 된다.
var addNumber = function (x,y) {
return x+y;
};
3) Function 생성자 함수
: new 연산자와 함꼐 호출하면 함수 객체를 생성해서 반환한다.
* 생성자 함수 = 객체를 생성하는 함수
var add = new Function('x', 'y', 'return x+y');
4) 화살표 함수(ES6)
: ES6에서 도입된 화살표 함수, 항상 익명함수로 정의한다.
var add = (x,y) => x+y;
4. 함수 특징
: 이상적인 함수는 한 가지 일만 해야하며 가급적 작게 만들어야 한다, 함수형 프로그래밍의 기본이다.
: 매개변수는 3개 이상 넘지 않는 것을 권장 한다.
5. 다양한 함수 유형
1) 즉시 실행 함수
: 함수 정의와 동시에 즉시 호출되는 함수
(function () {
var a = 3;
var b = 5;
return a*b;
}());
2) 재귀 함수
: 함수가 자기 자신을 호출하는 것
function recusive(n) {
if(n<0) return;
console.log(n);
recursive(n-1);
}
recursive(10);
3) 중첩 함수
: 함수 내부에 정의된 함수를 중첩 함수 또는 내부함수라 함, 중첩 함수를 포함하는 함수는 외부 함수라고 함
function outer() {
var x = 1;
// 중첩 함수
function inner() {
var y = 2;
console.log(x+y); // 3
}
inner();
}
outer();
4) 콜백 함수
: 함수의 매개변수를 통해 다른 함수의 내부로 전달되는 함수
: 고차 함수 = 매개 변수를 통해 함수의 외부에서 콜백 함수를 전달받은 함수
: 고차함수는 콜백 함수를 자신의 일부분으로 합성한다.
: 콜백 함수를 다른 곳에서도 호출할 필요가 있거나, 콜백 함수를 전달 받는 함수가 자주 호출된다면 함수 외부에서 콜백 함수를 정의 한 후 함수 참조를 고차 함수에 전달하는 것이 효율적임.
function repeat(n,f) {
for(var i =0; i< n ; i++){
f(i);
}
}
var logAll = function (i) {
console.log(i);
};
repeat(5, logAll);
5) 순수 함수와 비순수 함수
: 함수형 프로그래밍에서 어떤 외부 상태에 의존하지도 않고 변경하지도 않는, 부수 효과가 없는 함수를 순수 함수라 한다.
: 반대로 부수 효과가 있는 함수를 비순수 함수라 함.
// 순수함수
function increase(n) {
return ++n;
}
// 비순수함수
var count = 0;
function increase() {
return ++count;
};
6. 함수형 프로그래밍
: 순수 함수와 보조 함수의 조합을 통해 외부 상태를 변경하는부수 효과를 최소화해서 불변성을 지향하는 프로그래밍 패러다임
: 로직 내에 존재하는 조건문과 반복문을 제거해서 복잡성을 해결하며, 변수 사용을 억제하거나 생명 주기를 최소화해 상태 변경을 피해 오류를 최소화 한다.
: 자바스크립트는 멀티 패러다임 언어이므로 객체 지향 프로그래밍이 아닌 함수형 프로그래밍을 적극적으로 활용하고 있다.
p.s 함수형 프로그래밍을 실천하고 있냐를 물어봤을 때 부끄러움이 들었다..의식적으로 실천하려고 노력해야함을 절실히 깨달았다.