October 11, 2021
자바스크립트에서 함수는 값으로 취급됩니다. 이에 대해선 이미 배워서 알고 계실 겁니다.
모든 값은 자료형을 가지고 있는데, 그렇다면 함수의 자료형은 무엇일까요?
함수는 객체입니다.
함수는 호출이 가능한(callable) '행동 객체’라고 이해하면 쉽습니다. 우리는 함수를 호출 할 수 있을 뿐만 아니라 객체처럼 함수에 프로퍼티를 추가·제거하거나 참조를 통해 전달할 수도 있습니다.
함수 객체엔 몇 가지 쓸만한 프로퍼티가 있습니다.
‘name’ 프로퍼티를 사용하면 함수 이름을 가져올 수 있죠.
function sayHi() {
alert("Hi");
}
alert(sayHi.name); // sayHi
함수 객체에 이름을 할당해주는 로직은 아주 똑똑해서 익명 함수라도 자동으로 이름이 할당됩니다.
함수는 객체입니다.
이번 챕터에선 객체로서의 함수에서 사용 할 수 있는 프로퍼티 두 가지를 다뤄보았습니다.
name
– 함수의 이름이 저장됩니다. 대개는 함수 선언부에서 이름을 가져오는데, 선언부에 이름이 없는 경우엔 자바스크립트 엔진이 컨텍스트(할당 등)를 이용해 이름을 추론합니다.length
– 함수 선언부에 있는 인수의 수로 나머지 매개변수는 포함되지 않습니다.함수 표현식으로 함수를 정의하였는데 이름이 있다면 이를 기명 함수 표현식이라 부릅니다. 기명 함수 표현식의 이름은 재귀 호출과 같이 함수 내부에서 자기 자신을 호출하고자 할 때 사용할 수 있습니다.
함수엔 다양한 프로퍼티를 추가할 수 있습니다. 널리 쓰이는 자바스크립트 라이브러리 상당수에서 이런 커스텀 프로퍼티를 잘 활용하고 있습니다.
이런 라이브러리들은 ‘주요’ 함수 하나를 만들고 여기에 다양한 ‘헬퍼’ 함수를 붙이는 식으로 구성됩니다. jQuery는 이름이 $
인 주요 함수로 이루어져 있습니다. lodash는 주요 함수 _
에 _.clone
, _.keyBy
등의 프로퍼티를 추가하는 식으로 구성되죠. 자세한 정보는 lodash 공식 문서에서 찾아볼 수 있습니다. 이렇게 함수 하나에 다양한 헬퍼 함수를 붙여 라이브러리를 만들면 라이브러리 하나가 전역 변수 하나만 사용하므로 전역 공간을 더럽히지 않는다는 장점이 있습니다. 이름 충돌도 방지할 수 있죠.