모던 자바스크립트 딥다이브 스터디 #4-1 (CH 18 함수와 일급객체)
JS에서는 다음의 조건을 만족하는 객체를 일급 객체라고 한다.
무명의 리터럴로 생성할 수 있다. 즉, 런타임에 생성이 가능하다.
변수나 자료구조(객체, 배열)등에 저장할 수 있다.
// 1.함수는 무명의 리터럴로 생성할 수 있다.
// 2.1함수는 변수에 저장할 수 있다.
// 런타임(할당 단계)에 함수 리터럴이 평가되어 함수 객체 생성되고 변수에 할당됨
const increase = function(num){
return ++num;
};
const decrease = function(num){
return --num;
};
//2.2함수는 객체에 저장할 수 있다.
const auxs = {increase, decrease};
//막상 코드짜면서 느낀건데 진짜 이상하다. 함수를 이렇게 쓸 수 있다니
함수의 매개변수에 전달할 수 있다.
함수의 반환값으로 사용할 수 있다.
//3.1 함수는 매개변수가 될 수 있다.
//4. 함수는 반환값으로 사용할 수 있다.
function makeCounter(aux){ //aux가 함수 받는 매개변수이다..
let num = 0;
return function() { //함수 생성해서 반환한다.
num = aux(num); //aux사용..
return num;
};
}
//3.2 함수는 매개변수로 함수를 전달할 수 있다.
const increaser = makeCounter(auxs.increase);
console.log(increaser()); //1
console.log(increaser()); //2
const decreaser = makeCounter(auxs.decrease);
console.log(decreaser()); //-1
console.log(decreaser()); //-2
호출할 수 있는 객체라서 일급 객체가 아니었다…. 그나저나 위 사용법 보니까 어질어질 하다.
생각해보면 C에도 함수 포인터가 있긴 했다… 까다롭겠지만 함수 포인터 변수를 잘 이용하면 C에서도 위 내용을 구현할 수 있을 것 같긴 하다.. 다만 문법적 제약때문에 JS만큼 자유롭지는 못할듯.
함수는 객체이므로 프로퍼티를 가질 수 있다. 브라우저 콘솔에서 console.dir을 사용해 내부를 들여다보자.
square함수의 모든 프로퍼티의 프로퍼티 어트리뷰트를 확인해보자.
여기서 argumnets, caller, length, name, prototype프로퍼티는 모두 함수 객체의 데이터 프로퍼티이고, 일반 객체에는 없는 함수 고유의 프로퍼티이다.
참고로 여기서 __proto__
는 Object.prototype객체의 접근자 프로퍼티이다.
모든 객체가 Object.prototype객체의 프로퍼티를 상속받아 사용할 수 있으므로 __proto__
는 모든 객체가 이용할 수 있다. 상속에 대한 개념은 뒤에서 다루겠다.