06. 함수
06. 함수
태초에 javascript에 기명함수와 익명함수가 있었다.
기명함수의 경우 var와 마찬가지로 hoisting 문제가 발생했다.
ex)
myFunction(1, 2);
function myFunction(a, b) {}
// 함수 선언부 전에 함수 호출이 가능해져 코드가 복잡해지는 문제
이를 해결하기 위한 방법은 변수에 익명함수를 할당하는 것이다.
ex)
let resultMultiple = function(a, b) { return a * b; }
// 익명함수는 함수 선언 전에는 호출이 불가하다.
TypeScript는 함수의 매개변수와 반환타입에 모두 타입을 명시하여
함수내부에 타입 검증을 하는 불필요한 코드를 삭제하거나, 의도치 않은 캐스팅에 대비하도록 한다.
function max(x: number, y: number): number {...}
6.2 매개변수의 활용
1. 기본 초기화 매개변수 (default-initialized parameter)
function pow(x: number, y: number = 2): number {...}
2. 나머지 매개변수
// 매개변수를 최소 2개이상 받는 경우
function concat(a, b, ...restParameter) {
return a + b + restParameter.join("");
}
// 매개변수를 0개 이상 받는 경우
function concat(...restParameter) {
return restParameter.join("");
}
3. 선택 매개변수
function sum(a: number, b?: number): number {
return a + b;
}
console.log(sum(1));
함수에 선언된 매개변수는 2개지만, 2번째 매개변수에 선택 매개변수를 사용함으로써
인수 하나를 생략하더라도 에러가 발생하지 않는다.
다만, 선택 매개변수는 초기값 설정 매개변수와 동시에 사용할 수 없다.
function sum(a: number, b?: number = 2): number {...}
// 선택 매개변수의 경우 b에 대한 undefined 검사를 통해 초기값을 설정해야 한다.
function sum2(a: number, b?: number) {
if (b === undefined) {
b = 0;
}
return a + b;
}
console.log(sum2(1));
6.4. 함수 오버로드
function overloads : 함수명은 같지만, 매개변수와 반환 타입이 다른 함수 여러 개를 선언할 수 있는 것을 말한다.
function add(a: string, b: string): string;
function add(a: number, b: number): number;
function add(a: any, b: any): any {
return a + b;
}
가장 일반적인 함수를 가장 아래에 선언하고 그 위로 구체적인 타입을 명시한 함수의 시그니처를 쌓는 방식으로 선언한다.
function add(a: number): number;
function add(a: number, c: number): number;
function add(a: any, b?: any): any {
if (b === undefined) {
return a;
} else {
return a + b;
}
}
매개변수가 다른 오버로드를 지정할 때는 선택 매개변수를 둬 매개변수의 개수에 변화를 줄 수 있습니다.
pick 함수는 다양한 타입의 인수를 받고 반환 타입도 여러개 입니다.
오버로드에서 타입을 나열할 때 일반적인 타입을 가장 먼저 선언하고,
그 위로 세부적인 타입(number, object)를 선언했습니다.
function pick(x: { name: string }) : number;
function pick(x: { month: number }) : string;
function pick(x: number): number;
function pick(x: any): any {...}
object 타입은 속성명과 속성명의 타입에 따라 여러 형태가 올 수 있는데
예제에서는 { month: number }, { name: string } 과 같은 형태의 object 타입을 선언했습니다.
예제에서 pick 함수의 매개변수와 반환타입이 다양한데, 유니언 타입으로도 표현할 수 있습니다.
function pick(x: number | { month: number } | { name: string }) : string | number;
function pick(x: any): any {...}
6.3 익명함수
let x1 = () => { };
let y1 = x => { return x; };
let y2 = x => { return x; };
let y3 = x => x
매개변수가 1개일 때는 소괄호를 생략할 수 있습니다.
즉시 호출 함수
(x => { x; })(3);
let iif = (x => { return x; })(3);
- 화살표 함수를 filter과 reduce에 적용
- this도 사용할 수 있다.