함수는 변수처럼 선언한다가 아니라 정의한다고 표현한다.
왜냐면 선언 시에 undefined가 할당되지 않고 암묵적으로 식별자가 생성되고 정의되기 때문이다. 함수는 이렇게 생겼다.
function 함수이름(매개변수){
//수행문 적는 곳
return 반환값;//반환문
}
함수이름(인수);//함수호출
일반적인 함수 선언문과 다르다.
var add = function(x,y){
return x+y;
}
함수는 객체 타입의 값이다. 단 호출할 수 있는 객체이다.
함수이름 : 함수 몸체 내에서만 참조할 수 있다. (그 외는 참조 불가능) 리터럴은 사람이 이해할 수 있는 값이기 때문에 그 값을 그냥 호출할 수는 없다. 하지만 할당한 변수로는 호출이 가능하다.
매개변수 : 함수 선언문 작성 시 ( )안에 들어가고 쉼표로 구분한다. 함수 몸체 내에서 변수와 동일하게 취급된다.
함수몸체 : 함수 호출 시 실행될 문들을 하나의 실행 단위로 정의한 코드블록이다.
함수 리터럴은 값으로 판단이 되어 변수에 할당이 가능하지만 함수 선언문은 표현식이 아니다! 선언문 자체를 변수에 할당할 수 없다. 그래서 함수이름이 꼭 필요하다. 형태는 동일하지만 값인지 아닌지의 차이가 있다. 문맥에 따라 함수 선언문이 될 수도 리터럴이 될 수도 있다. 이는 함수를 생성하는 내부 동작에 차이가 있다.
함수는 함수이름으로 호출되는 것이 아니라 할당된 식별자로 호출한다. 함수 선언문으로 정의된 함수와 변수에 할당되어 정의된 함수의 차이가 있다.
같은 말을 계속 반복하고 있다.
함수 리터럴을 식별자에 할당하는 식을 함수 표현식이라고 한다. 선언문과 표현식 값이 아니냐 값이냐의 차이가 있다. 둘은 다른 식이고 함수 생성시점이 다르다. 그래서 함수 선언문으로 정의된 함수는 함수 호이스팅이 일어나게 된다. 함수 표현식으로 정의(?)된 함수는 변수 호이스팅이 일어나게 된다.
함수 선언문에서 함수 호이스팅이 일어나는 이유는 함수의 생성시점이 런타임 이전에 정의되기 때문이다. 함수 표현식으로 함수 리터럴을 변수에 할당하여 생성되는 시점은 런타임인 경우이다. 변수가 선언될 때는 런타임 이전에 undefined가 할당되어 선언된다. 함수 표현식은 이와 같다.
매개변수는 함수를 정의하는 식에 ( ) 안에 들어가는 변수 즉 런타임 이전에 undefined로 선언되는 변수이다. 인수는 함수를 호출할 때 들어오는 외부의 실제 값이다. 매개변수에 인수가 들어오지 않는 경우 undefined가 된다.
매개변수는 최대 3개를 넘지 않는 것이 가독성에 좋다. 그 이상일 경우에는 객체로 만들어서 매개변수 하나로 넣는 방법이 있다. JS엔진은 인수의 개수를 매개변수 개수와 맞추지 않는다. 또 동적 타입 언어이므로 사전에 타입을 지정할 수 없다.
return 키워드 뒤에 표현식으로 이루어진다.
return 이후의 문은 무시된다. return 뒤의 표현식을 평가하여 반환하므로 항상 평가된 '값'이 반환된다. 아무것도 반환하지 않거나 return이 생략된 경우 undefined를 반환한다. 함수 몸체 내부에서만 사용이 가능하다.
(function(매개변수){
함수몸체
반환문
}()//바로 호출
);
function a(n){
if(n<0) return n;//무한루프에서 빠져나오기위한 탈출 조건을 무조건 만들어 놓아야한다.
a(n-1);//함수 선언문 내부에서 같은 함수를 호출하는 것을 재귀함수라고 한다.
}
함수 내부에서 함수를 정의한 것으로 스코프와 클로저에 깊은 연관이 있다.
매개변수로 함수 자체가 들어오는 것 인수처럼 자신이 정한 때에 사용이 가능하다. 호출이 되는 것이 아니라 선언문이 들어온다. 함수형 프로그래밍 패러다임에 사용되며 비동기 처리에 활용되는 중용한 패턴이다.(AJAX, 이벤트, setTime함수 등)
function outer(innerFunc){
return;
}
outer(function(a){console.log(a);}/*callback 함수를 사용하는 법*/);
위에서 소개한 함수들 중 어떤 함수라도 외부에 영향을 준다면 비순수 함수이고 영향을 주지 않는다면 순수 함수이다. 매개변수로 객체를 인수로 받는 함수는 무조건 비순수 함수이다. 왜냐하면 참조에 의한 전달이 진행될 수 있기 때문이다. 객체가 인수면 함수 내에서 프로퍼티를 바꿀 수 있다. 그럼 외부에 영향을 주게 된다. 그래서 비순수 함수인 것. 비순수 함수는 예측을 불가하게 만들 여지가 있으므로 최대한 줄이는 것이 좋다.
순수 함수와 보조 함수(콜백함수처럼 함수에 들어오는 보조적인 함수?)의 조합을 통해 불변성을 지향하는 프로그래밍 패러다임이다.
외부에 영향을 주지 않고 함수 내에서만 모든 것을 하려고 하는 프로그래밍 같아보인다. 왜냐면 함수가 가진 장점이 코드의 재사용을 통해 중복을 없애고 유지보수를 쉽게 할 수 있기 때문이다. 따라서 조건문이나 반복문을 최소화하여 가독성을 높이고 변수 사용을 억제하여 오류가 잘 발생하지 않도록 또한 예기치 못한 값의 변경이 일어나지 않도록 하는 것이 함수형 프로그래밍이다.