자바스크립트는 객체지향 언어와 함수형 언어의 특징 모두 가지고 있다.
따라서 타입스크립트 또한 자바스크립트의 이런 특징을 모두 포함한다.
프로그래밍 언어가 일등 함수 기능을 제공하면 함수형 프로그래밍 언어라고 한다. 일등 함수란, 변수와 함수를 구분하지 않는다는 의미인데 아래의 예시 코드를 보면 이해 하기 쉽다.
let f = function(a : number, b: number) : number{
return a + b;
}
console.log(f(2,3)); // 5
f = function(a: number, b: number):number{
return a - b
}
console.log(f(4,2)); // 2
일등 함수를 제공하기 때문에 변수처럼 함수도 재할당이 가능하다.
1개의 함수에는 1개의 기능을 하는 것을 권장함으로 함수를 만들 때는 가급적 const로 만들면 되겠다.
프로그램 언어에서는 표현식(expression)이라는 용어는 리터럴(literal), 연산자(operator), 변수, 함수 호출(function call) 등이 복합적으로 구성된 코드 형태를 의미한다.
표현식은 항상 컴파일러에 의해 계산법이 적용되어 어떤 값이 된대.
예를 들어 표현식 1 + 2는 컴파일러에 의해 3이라는 값이 된다.
그럼 이어서 함수 표현식에 대해 알아보자
함수 표현식은 함수로 선언된 부분 즉,
예를 들어
function(a : number, b: number) : number{
return a + b;
}
위와 같은 부분을 함수 표현식이라고 한다.
컴파일러는 표현식을 만나면 계산법을 적용해 어떤 값을 만드는데 계산법에는 조급한 계산법(eager evaluation)과 느긋한 계산법(lazy evaluaion) 두가지가 있다.
컴파일러가 1 + 2라는 표현식을 만나면 조급한 계산법으로 3이라는 값을 만들고 function expression을 만나면 느긋한 계산법을 적용해 계산을 보류한다.
어떤 변수가 함수 표현식을 담고 있다면 변수 뒤에 함수 호출 연산자(function call operator)()를 붙여서 호출 할 수 있다.
여기서 함수 호출 이란 함수 표현식의 몸통 부분을 실행한다는 뜻이다.
우리가 평소에 함수를 선언하고 사용하는 것은 변수뒤에 함수 호출 연산자를 붙여서 함수를 호출하는 것이다.
let f = function(a : number, b: number) : number{
return a + b;
}
console.log(f(2,3));
// 여기서 변수 f 뒤에 함수호출 연산자를 사용하여 함수를 호출하고 있다.
// 함수를 호출하면 계산법이 적용되어 값으로 사용되고
// 다른 변수에 담을 수 있다.
let functionResult = f(2,3);
console.log(functionResult); // 5
함수 선언 시 함수명을 사용하지 않는 함수이다.
아래의 코드도 익명함수를 적용한 예시이다.
let value = (function(a, b){return a + b;})(1, 2)
console.log(value); // 3
일반적으로 연산자들이 연산자 우선순위가 다르면 (1+2) * 5 처럼 소괄호를 사용해 우선순위를 변경한다.
따라서 소괄호로 함수표현식을 묶어서 정상적으로 함수 표현식의 시작과 끝 부분을 알 수 있게한다.
컴파일러는 익명함수 부분을 느긋한 계산법으로 그 상태 그대로 놔두지만, 함수호출 연산자를 만나면서 곧바로 조급한 계산법을 적용해 최종적으로 3이라는 값을 만들어 변수 value에 적용한다.
위에서 잠깐 이야기 했듯이 함수 표현식을 담는 변수를 let보다는 const 키워드로 선언하는 것이 바람직하다.
const 로 선언하면 중간에 함수가 바뀔 일이 없어서 추후 예기치 못한 에러를 예방한다.