고차함수(higher order function)는 함수를 인자(argument)로 받을 수 있고, 함수의 형태로 리턴할 수 있는 함수이다.
함수는 변수에 저장할 수 있고, 함수는 함수를 담은 변수를 인자로 전달받을 수 있다.
마찬가지로, 함수 내부에서 변수에 함수를 할당할 수 있고, 함수는 이 변수를 리턴할 수 있다.
여기서 변수에 할당하지 않고 함수를 바로 이용할 수 있다. 어떤 고차 함수에 함수를 인자로 전달하고, 고차 함수는 함수 자체를 리턴한다.(변수가 빠졌을 뿐, 동일하게 동작함) 이때 다른 함수(caller)의 인자(argument)로 전달되는 함수를 콜백 함수(callback function)라고 한다.
콜백 함수를 전달받은 고차 함수는, 함수 내부에서 이 콜백 함수를 호출(invoke)할 수 있다.caller는 조건에 따라 콜백 함수의 실행 여부를 결정할 수 있다. 아예 호출하지 않을 수도 있고,여러 번 실행할 수도 있다.
'함수를 리턴하는 함수'는 커리 함수 라고 한다. 정확하게 구분하자면, 고차함수가 커리 함수를 포함한다.
//함수를 인자로 받는 함수 -> 콜백 함수
//함수를 리턴하는 함수 -> 커리 함수
'함수를 리턴하는 함수'와'함수를 인자로 받는 함수' 모두, 용어를 고차 함수로 사용해도 상관은 없다.
다른 함수를 인자로 받는 경우

-->
함수 B는 다른 함수를 인자로 받는 고차 함수이다.
함수 B의 첫 번째 인자 func에 함수가 들어올 경우, 함수 func는 함수 B의 콜백 함수이다.
위와 같은 경우, 함수A는 함수B의 콜백 함수 이다.
함수를 리턴하는 경우

-->
함수 A는 다른 함수를 리턴하는 고차 함수이다.
A는 인자 한 개를 입력받아서 함수(익명 함수)를 리턴한다.
리턴되는 익명 함수는 인자 한 개를 받아서 i와 더한 값을 리턴한다.
A는 함수이므로 함수 호출 기호 '()'를 사용할 수 있다.

-->
함수 B는 고차 함수 이다.
함수 B의 인자 func는 함수 B의 콜백 함수 이다.
함수 A는 함수 B의 콜백으로 전달되었다.
B(5, A)는 함수이므로 함수 호출 기호 '()'를 사용할 수 있다.
B가 리턴하는 함수를 변수에 저장할 수 있다.(일급 객체)