자바스크립트는 함수형 언어 스킴과 프로토타입 기반 객체지향 언어 셀프를 모델로 만들어졌다.
따라서 자바스크립트는 객체지향 언어와 함수형 언어의 특징이 모두 있다.
타입스크립트 또한 자바스크립트의 이런 특징을 모두 포함한다. 자바스크립트에서 함수는 function 클래스의 인스턴스이다.
아래 예문을 보면 add가 함수로 동작하는 것을 확인할 수 있다.
let add = new Function('a', 'b', 'return a+b')
let result = add(1,2)
console.log(result) // 3
1행은 변수 선언문 형태로 add를 구현했다.
다음과 같은 형태로도 가능하다.
let add = function(a, b){return a+b}
이처럼 함수 선언문에서 함수 이름을 제외한 코드를 함수 표현식이라고 한다.
함수 표현식은 함수형 언어의 핵심 기능이다.
프로그래밍 언어가 일등 함수 기능을 제공하면 함수형 프로그래밍 언어라고 한다.
자바스크립트와 타입스크립트는 일등 함수 기능이 있으므로 함수형 프로그래밍 언어이다.
일등 함수란, 함수와 변수를 구분하지 않는다는 의미이다.
let f = function(a, b) {return a+b}
f = function(a, b) {return a-b}
예를 들어, f는 let키워드가 앞에 있으므로 변수이다.
변수이므로 값을 저장할 수 있고,
변수 f에는 a+b 형태의 함수 표현식을 저장했다.
또한 a-b형태의 함수 표현식도 저장할 수 있다.
따라서, f가 변수인지 함수인지 사실상 구분할 수 없다.
이것이 변수와 함수를 차별하지 않는다는 의미이다.
프로그래밍 언어에서 표현식이라는 용어는 리터럴, 연산자, 변수, 함수 호출 등이 복합적으로 구성된 코드 형태를 의미한다.
표현식은 항상 컴파일러에 의해 계산법이 적용되어 어떤 값이 된다.
예를 들어 표현식 1+2 는 컴파일러에 의해 3이라는 값이 된다.
앞서 보았던
function(a, b){return a+b}
형식을 함수 표현식이라고 한다.
컴파일러는 표현식을 만나면 계산법을 적용해 어떤 값을 만든다. 계산법에는 조급한 계산법과 느긋한 계산법이 있다.
컴파일러가 1+2라는 표현식을 만나면 조급한 계산법을 제공해 3이라는 값을 만든다.
반면, function(a, b){return a+b}와 같은 함수 표현식을 만나면 심벌 a, b가 어떤 값인지 알 수 없어, 느긋한 계산법을 적용해 계산을 보류한다.
어떤 변수가 함수 표현식을 담고 있다면, 변수 이름 뒤에 함수 호출 연산자를 붙여서 호출할 수 있다.
함수 호출이란, 함수 표현식의 몸통 부분을 실행한다는 뜻이다.
만약 함수가 매개변수를 요구한다면, 함수 호출 연산자 ()안에 필요한 매개변수를 명시할 수 있다.
let f = function(a, b) {return a+b}
let value = f(1,2)
f변수는 함수 표현식을 담고 있으므로, 변수 이름 뒤에 함수 호출 연산자 (1,2)를 붙여 f(1,2)라는 함수 호출문을 만들 수 있다.
컴파일러는 함수 호출문을 만나면, 지금까지 미뤘던 함수 표현식에 조급한 계산법을 적용해 함수 표현식을 값으로 바꾼다.
f(1,2) 형태로 함수가 호출되면, 컴파일러는 f변수에 저장된 함수 표현식을 끄집어 낸 뒤 조급한 계산법을 적용한다.
조급한 계산법을 함수 표현식에 적용한다는 의미는, 함수 표현식의 몸통 부분을 실행한다는 의미이다.
앞 코드에서 함수 몸통은 return a+b인데, 매개변수 값들이 확정되면 몸통은 return 1+2로 바뀐다.
여기에 다시 조급한 계산법이 적용되어 return 3이 된다.
함수표현식은 대부분의 언어에서 언급되는 익명함수의 다른 표현이다.
자바스크립트에서는 다음과 같이 작성된 코드를 만든다.
let value = (function(a, b) {return a+b})(1,2) // 3
앞 코드를 이해하려면, 연산자 우선순위를 고려하여 코드를 분해해야 한다.
let value =
(function(a, b) {return a+b})
(1,2) // 3
컴파일러는 2번째 행의 익명 함수 부분에 게으른 계산법을 적용해 그대로 두지만,
곧바로 함수 호출 연산자 ()를 만나므로 2행에 조급한 계산법을 적용해 최종적으로 3이라는 값을 만들어 낸다.
그 뒤 1행의 value변수에 이 값을 대입한다.
함수 표현식을 담는 변수는 let보다는 const 키워드로 선언하는 것이 바람직하다. let 키워드는 변수값이 변할 수 있기 때문이다.