18장. 함수와 일급 객체

Happhee·2021년 12월 6일
0

JS : Depp Dive

목록 보기
15/35
post-thumbnail

1. 일급 객체

  • 무명의 리터럴로 생성할 수 있음. 런타임에 생성이 가능
  • 변수나 자료구조(객체, 배열 등)에 저장 가능
  • 함수의 매개변수에 전달
  • 함수의 반환값으로 사용
//무명의 리터럴로 생성
const increase = function (num) {
    return ++num;
}

const decrease = function (num) {
    return --num;
}
// 객체에 저장
const predicates = { increase, decrease };
//매겨변수로 전달 및 반환값으로 사용
function makeCounter(predicates) {
    let num = 0;

    return function () {
        num = predicates(num);
        return num;
    };
}

const increaser = makeCounter(predicates.increase);
console.log(increaser());
console.log(increaser());

const decreaser = makeCounter(predicates.decrease);
console.log(decreaser());
console.log(decreaser());
  • 일급 객체
    함수가 가지는 가장 큰 특징
    -> 함수의 매개변수에 전달 가능 + 함수의 반환값으로 사용 가능!!

  • 함수형 프로그래밍 가능

  • 함수 객체는 일반 객체에는 없는 함수 고유의 프로퍼티를 소유

2. 함수 객체의 프로퍼티

함수 == 객체

  • 함수도 프로퍼티를 가질 수 있음
    Object.getOwnPropertyDescriptors 메서드로 확인
    arguments, caller, length, name, prototype

arguments

함수 호출 시 전달된 인수(argument)들의 정보를 담고 있는 순회 가능한 (iterable) 유사 배열 객체 , 함수 내부에서 지역 변수처럼 사용됨

  • 함수를 정의할 때 선언한 매개변수 -> 함수 몸체 내부에서 변수와 동일하게 취급됨
  • 선언된 매개변수의 개수보다 인수를 적게 전달하면 전달되지 않은 인수는 undefined로 되고, 많으면 초과된 인수를 무시
  • 프로퍼티 값 : 인수
  • 프로퍼티 키 : 인수의 순서
  • 유사배열 객체 : length 프로퍼티를 가진 객체로 for문으로 순회할 수 있는 객체
function sum() {
    let res = 0;

    for (let index = 0; index < arguments.length; index++) {
        res += arguments[index];
    }
    return res;
}

console.log(sum());
console.log(sum(1, 2));
console.log(sum(1, 2, 3));

length

  • 함수를 정의할 때, 선언한 매개변수의 개수

  • arguments 객체의 length 프로퍼티 : 인자의 개수 (argument)

  • 함수 객체의 length 프로퍼티 : 매개변수의 개수 (parameter)

    name

  • 함수의 이름

//기명 함수 표현식
var namedFunc = function foo() { }
console.log(namedFunc.name);

//익명 함수 표현식
var anonymousFunc = function () { };
console.log(anonymousFunc.name);

//함수 선언문
function bar() {}
console.log(bar.name);

_ _proto _ _

  • 모든 객체는 [[Prototype]]이라는 내부 슬롯을 갖는다.
  • _ _ proto _ _ : 내부 슬롯이 가리키는 프로토타입 객체에 접근하기 위해 사용하는 접근자 프로퍼티
const obj = { a: 1 };
console.log(obj.__proto__ === Object.prototype);

console.log(obj.hasOwnProperty('a'));
console.log(obj.hasOwnProperty('__proto__'));

console.log(obj)

prototype

  • 생성자 함수로 호출할 수 있는 함수
  • constructor만이 소유하는 프로퍼티
  • non-constructor 에는 없다!
profile
즐기면서 정확하게 나아가는 웹프론트엔드 개발자 https://happhee-dev.tistory.com/ 로 이전하였습니다

0개의 댓글