자바스크립트의 함수는 객체이고, 모든 자바스크립트 객체와 같이 함수에도 메소드가 있다
그 중 call()과 apply()는 함수를 간접적으로 호출한다
두 메소드 모두 this 값을 명식적으로 지정할 수 있는데,
어떤 함수든지 특정 객체의 메소드로 호출할 수 있다는 뜻이다
심지어 함수가 그 객체에 속하지 않더라도 가능하다
call() 메소드는 자신에게 주어진 전달 인자를 호출할 함수의 전달 인자로 사용하고 apply()
메소드는 값 배열을 전달 인자로 사용한다
자바스크립트에서 함수를 정의할 때는 함수 매개변수의 타입(자료형)을 명시하지 않는다
함수를 호출할 때도 전달하는 인자 값을 검사하지 않고, 심지어 전달인자의 개수도 검사하지 않는다
정의된 것 보다 적은 수의 전달 인자로 호출 시,
나머지 매개변수는 undefined로 설정된다
함수가 호출될 때 정의된 매개변수 보다 더 많이 인자가 전달되면,
매개변수 이름이 붙지 않은 인자 값을 직접적으로 참조할 방법은 없다
Arguments 객체는 이런 문제에 대한 해결책이다
Arguments 객체는 유사 배열 객체고, 인데스 번호로 함수의 전달 인자를 얻을 수 있다
Arguments 객체도 length 프로퍼티를 가지고 있다
임의 개수의 전달 인자를 받을 수 있는 함수를 보통 varargs 함수 등으로 부른다
arguments는 배열이 아니라 Arguments 객체다
배열 메소드를 사용할 수 없음
arguments를 매개변수 이름이나 지역 변수 이름이나 지역변수 이름으로 사용할 수 없다
그리고 어떤 값을 할당할 수도 없다
Arguments 객체는 배열 원소 외에도 calle와 calleer 프로퍼티를 정의하고 있다
읽거나 쓸 수 없다
callee 프로퍼티가 현재 실행되고 있는 함수를 참조한다고 정의하고 있다
caller는 비표준이지만 많은 자바스크립트 구현체에 보편적으로 구현된 프로퍼티며, 호출한 함수를 참조한다
caller 프로퍼티는 호출 스택에 접근할 수 있도록 해주고, callee 프로퍼티는 이름 없는 함수를 재귀적으로
호출하는데 유용하다
const factorial = function(x) {
if(x <= 1) return 1;
return x * arguments.callee(x-1);
}
함수에 세 개 이상의 매개변수가 있다면, 호출하는 순서를 기억하기 어렵다
이럴 경우 전달 인자를 순서에 상관 없이 이름/값의 쌍으로 함수에 전달하는 편이 효과적일 수 있다
자바스크립트 메소드의 매개변수에는 정의된 형식도 없고, 함수에 전달한 값에 대해
자료형 검사를 하지 않는다
한두 번 사용하고 버릴 함수가 아니라면 자료형 검사를 하는 코드를 추가하는 것이 좋다
-> 타입 스크립트 쓰면 됨
함수의 가장 중요한 특징은 정의될 수 있고 또 호출될 수 있다는 점이다
함수 정의와 호출은 자바스크립트 뿐만 아니라 대부분 프로그래밍 언어의 문법의 특징이다
자바스크립트에서 함수는 문법일 뿐만 아니라 값이기도 하다
함수가 변수에 할당될 수 있고, 객체의 프로퍼티나 배열 원소로 저장될 수 있으며, 다른 함수의 인자로 전달될 수도 있고, 여러 방식으로 사용될 수 있음을 뜻한다
함수가 자바스크립트 문법일 뿐만 아니라 자바스크립트 데이터도 될 수 있다
값으로서의 함수 예시로는 Array.sort() 메소드를 들 수 있다
sort() 메소드는 정렬을 어떻게 할지 알려주는 함수를 선택적 인자로 받는다
때문에 sort() 메소드는 일반화 되고 한없이 유연해질 수 있다
어떤 형식에 데이터라도 상상하는 모든 순서로 정렬할 수 있다