함수는 특별한 객체
JavaScript에서 함수는 객체입니다. 객체와 마찬가지로 함수에는 프로퍼티와 함수가 존재하며, 함수를 변수, 배열, 객체에 할당하거나 다른 함수에 인수로 전달할 수 있습니다.
다음 예제는 typeof와 instance 연산자를 사용하여 Add() 함수가 객체 인스턴스인지 확인합니다.
function Add(a, b) {
return a + b;
}
console.log(typeof Add); // function
console.log(add instanceof Object); // true
console.log(add instanceof Function); // false
typeof 연산자는 object가 아닌 function을 반환했는데, 이러한 이유는 함수는 일반 객체보다 특별하기 때문입니다.
C, C#, Java와 같은 프로그래밍 언어에서는 함수를 변수에 할당할 수 없습니다. 하지만, JavaScript에서 함수를 변수에 할당할 수 있으며, 함수 객체만의 표준 프로퍼티가 정의되어 있으므로 일반 객체보다 특별합니다.
함수의 프로퍼티
다음 예제를 실행하여 함수, 객체, 배열의 프로퍼티를 살펴봅시다.
function Add(a, b) {
return a + b;
};
const obj = {};
const array = [];
console.dir(Add);
console.dir(obj);
console.dir(array);
실행 결과
객체인 obj는 프로퍼티가 존재하지 않으므로 [[Prototype]]라는 내부 프로퍼티만 존재합니다.
배열인 array는 기본적으로 length 프로퍼티와 [[Prototype]]라는 내부 프로퍼티가 존재합니다.
함수는 5개의 표준 프로퍼티(arguments, caller, length, name, prototype)가 존재합니다.
caller 프로퍼티는 보안 문제로 더 이상 사용되지 않으며, caller 프로퍼티가 출력되는 이유는 호환성 목적으로 남아있기 때문입니다.
이번 포스팅은 length, name 프로퍼티에 대해서 소개합니다.
length 프로퍼티
length 프로퍼티는 함수 인자의 개수를 나타냅니다.
다음 예제를 통해 length 프로퍼티를 이해할 수 있습니다.
function func0() {
}
function func1(a) {
}
function func2(a, b) {
}
console.log('func0.length: ' + func0.length);
console.log('func1.length: ' + func1.length);
console.log('func2.length: ' + func2.length);
실행 결과
만약, 다음 예제처럼 함수에 나머지 매개변수가 존재하는 경우 length 프로퍼티의 값은 0입니다.
function func(...args) {
}
console.dir(func);
console.log('func.length: ' + func.length);
실행 결과
추가적으로 함수의 length 프로퍼티는 읽기 전용이므로 값을 할당해도 반영되지 않습니다.
function func() {
}
func.length = 10;
console.dir(func);
console.log('func.length: ' + func.length);
실행 결과
name 프로퍼티
name 프로퍼티는 length 프로퍼티와 동일하게 읽기 전용이며, 함수의 표준 프로퍼티입니다.
name 프로퍼티는 함수 생성 방법에 따라 값이 다릅니다.
- 함수 선언문으로 함수를 생성하는 경우 함수의 이름
- 함수 표현식으로 함수를 생성하는 경우 함수를 최초 할당한 변수의 이름
- 익명 함수라면 빈 문자열
다음 예제는 함수 생성 방법에 따라 함수의 프로퍼티를 보여줍니다.
function func0() { }; // 함수 선언문
let func1 = function() {}; // 함수 표현식 1. 최초 할당
let func2 = func1; // 함수 표현식 2. 할당된 변수를 다른 변수에 할당
console.log(func0.name);
console.log(func1.name);
console.log(func2.name);
console.dir(function() {}); // 익명 함수
실행 결과
정리
- JavaScript에서 함수는 객체이며 일반 객체보다 특별합니다.
- length 프로퍼티는 함수의 인자 개수입니다.
- name 프로퍼티는 함수의 이름이며 익명 함수인 경우 빈 값입니다.
'JavaScript > 함수' 카테고리의 다른 글
[JavaScript]함수와 메서드(Function and Method) (0) | 2022.07.03 |
---|---|
[JavaScript]함수의 리턴값 (0) | 2022.07.01 |
[JavaScript]익명 함수(Anonymous Functions) (0) | 2022.06.28 |
[JavaScript]함수 생성 방법 (0) | 2022.06.27 |
[JavaScript]매개변수의 정보를 가지는 arguments 객체 (0) | 2022.06.27 |
댓글