자바스크립트의 함수는 아래와 같은 조건을 만족하므로 일급객체다
- 무명의 리터럴로 생성할 수 있다 ( = 익명함수를 만들 수 있다 )
- 변수나 자료구조( 객체, 배열 )에 저장할 수 있다
- 함수의 매개변수에 전달할 수 있다
- 함수의 반환값으로 사용할 수 있다
// 1. 함수는 이름 없이 리터럴로 생성할 수 있다
// 2. 함수는 변수에 저장할 수 있다
const increase = function (num){
return ++num;
};
const decrease = function (num){
return --num;
};
// 2. 함수는 객체에 저장할 수 있다
const auxs = { increase, decrease};
// 3. 함수의 매개변수에 전달할 수 있다
// 4. 함수의 반환값으로 사용할 수 있다
function makeConunter (aux){
let num = 0;
return function (){
num = aux(num);
console.log(num)
return num;
};
}
// 3. 함수는 매개변수에게 함수를 전달할 수 있다 = 함수 호출의 인수
const increaser = makeConunter(auxs.increase);
console.log(increaser()) // 1
console.log(increaser()) // 2
const decreaser = makeConunter(auxs.decrease);
console.log(decreaser()) // -1
console.log(decreaser()) // -2
함수가 일급객체라는 것은 함수를 객체와 동일하게 사용할 수 있다는 의미
- 값을 사용할 수 있는 곳이라면 어디서든지 리터럴로 정의할 수 있다
( 변수 할당문 - let, const / 객체의 프로퍼티 값, 배열의 요소, 함수 호출의 인수, 함수 반환문 - return ) - 런타임 함수 객체로 평가된다.
- 일반 객체와 같이 함수의 매개변수에 전달할 수 있고, 반환값으로도 사용할 수 있다
- 함수객체는 일반 객체에는 없는 함수 고유의 프로퍼티를 소유한다
함수 객체의 프로퍼티
함수도 프로퍼티를 가질 수 있다. console.dir메서드를 사용하여 함수 객체를 볼 수 있다.
function square(number){
return number * number;
}
console.dir(square)
console.log() // HTML 트리구조 출력
console.dir() // JSON 트리구조 출력
square 함수의 모든 프로퍼티 속성도 Object.getOwnPropertyDescriptors메서드로 확인할 수 있다.
자바스크립트 엔진이 프로퍼티를 생성할 때 프로퍼티 어트리뷰트를 기본적으로 정의한다.
( 프로퍼티 값 value, 값의 갱신여부 writable, 열거가능 여부 enumerable, 재정의 가능여부 configurable )
하지만 프로퍼티 어트리뷰트는 자바스크립트 엔진이 관리하는 내부 상태값이라 우리가 직접 접근할 수는 없다.
하지만 디스크립터 메서드(Object.getOwnPropertyDescriptors)를 사용해 간접적으로 확인할 수 있다.
1) argument 프로퍼티
- 함수 호출 시 전달된 인수들의 정보를 배열 형태로 담고 있는 유사 배열 객체이다.
( 유사배열 객체 ? length프로퍼티를 가진 객체로 for문으로 순회할 수 있는 객체를 말한다 ) - 함수 내부에서 지역변수처럼 사용된다.
- 자바스크립트는 함수의 매개변수와 인수의 개수가 일치하는지 확인하지 않는다. 함수 호출 시 매개변수 개수만큼 인수를 전달하지 않아도 에러가 발생하지 않는다.
- 초과된 인수는 결과에 출력되지는 않지만 argument객체에 프로퍼티로 보관된다.
function multiply(x,y){
console.log(arguments);
return x*y;
}
console.log(multiply()) // NaN ( undefined * undefined )
console.log(multiply(1)) // NaN ( 1 * undefined )
console.log(multiple(1,2)) // 2
console.log(multiple(1,2,3)) // 2
2) caller 프로퍼티: ECMAscript 사양에 포함되지 않은 비표준 프로퍼티이다.
3) length 프로퍼티 : length프로퍼티는 함수를 정의할 때 선언한 매개변수의 개수를 가리킨다.
4) name 프로퍼티 : name프로퍼티는 함수 이름을 나타낸다.
5) prototype 접근자 프로퍼티
'개발공부_Blog > JavaScript' 카테고리의 다른 글
Strict mode (엄격모드) (0) | 2022.09.26 |
---|---|
객체지향 프로그래밍과 프로토타입, 상속 (1) | 2022.09.25 |
생성자함수의 객체 생성 (0) | 2022.09.24 |
let, var, const 변수, 상수를 선언하는 키워드 (0) | 2022.09.21 |
var, let 키워드의 변수 생성과정과 TDZ(일시적 사각지대) (0) | 2022.09.21 |
댓글