< JavaScript 3편: 일급객체와 함수 프로퍼티 >

“자바스크립트에서 함수는 일급 객체라고 말한다.”

함수가 객체라고? 내가 아는 객체는 중괄호{}로 여닫는 데이터 타입인데..

let user = new Object();
let user = {};
  • 그렇다면 객체(Object)란?
    단 하나의 불변값을 갖는 원시타입String, Number, Boolean, null, undefined, Symbol과 반대되는 용어로서, 내부에 여러 데이터와 함께 그 데이터를 조작하는 동적인 방법(메소드)까지 모두 담는 '복합적인 자료구조'이다.

  • 구분은 어떻게 해?
    원시타입인지 객체타입인지는 console.dir()을 통해 알 수 있다.

  • 객체 중에서 함수란?
    다른 곳에서 해당 객체를 호출함으로써 재사용이 가능한 객체를 함수라고 한다.

  • 이러한 함수의 특징은 뭐야?

  1. 무명의 리터럴로 표현 가능
const increase = function(num) {
  ++num;
};
const decrease = function(num) {
  --num;
};
  1. 변수나 다른 자료구조에 할당 가능
const predicates = { increase, decrease };
  1. 함수의 매개변수로 전달 가능
  2. 함수의 반환값으로 사용 가능
function makeCounter(predicates) {
  let num = 0;
  return function () {
    return predicates(num);
  };
}
makeCounter(predicates.increase);

-> 이 네가지 특징의 공통점은 함수가 '값'으로 사용된다는 것이다.

  • 그렇다면 결론은?
    특정 값을 또 다른 값에 이용하는데 제한이 없는 프로그래밍 방식이다. 자바스크립트의 함수 = 일급 객체 = 일급 함수(값으로 이용될 수 있는 함수)

"함수 또한 객체로서 프로퍼티를 가진다는 것이다. 함수 객체의 프로퍼티로는 argument, caller, length, name, prototype, ㅡprotoㅡ, [[FunctionLocation]], [[Scopes]]가 있다. 이 중 [[FunctionLocation]], [[Scopes]] 는 자바스크립트 엔진이 내부 알고리즘을 공개하고 싶지 않다는 의미로 대괄호로 표현한 내부슬롯이라서, 조작이 불가능하다. 하지만 나머지 것들은 우리가 접근하고 조작할 수 있다. 즉 우리가 접근 가능한 내부 슬롯을 프로퍼티 어트리뷰트라 한다."

  • argument
    함수 호출 시 전달된 인수(argument)들의 정보를 담고 있는 순회가능한(iterable) 유사 배열 객체(array-like object)이며 함수 내부에서 지역변수처럼 사용된다. 즉, 함수 외부에서는 사용할 수 없다.
  • caller
    ECMA Script표준에 등재되지 않았기에, 사용하지 않는 것을 권장한다.
  • length
    함수 객체의 length프로퍼티는 인자(매개변수)의 개수를 말한다. arguments 프로퍼티 안의 length가 인수의 개수라는 것과 다르니 주의해야 한다.
  • name
    함수명을 나타낸다. 기명함수의 경우 함수명을 값으로 갖고 익명함수의 경우 빈문자열을 값으로 갖는다.
  • ㅡprotoㅡ
    자바스크립트의 모든 객체는 [[Prototype]]이라는 외부에서 접근 불가능한 내부 슬롯을 가진다. [[Prototype]]은 객체 지향 프로그래밍에서 중요한 '상속'을 구현하는 프로토타입 객체를 가리키는데, 자바스크립트 엔진은 개발자에게 이에 대한 접근을 제한적으로 허용하기 위해 ㅡprotoㅡ라는 접근자 프로퍼티를 제공한다.
  • prototype
    함수 중에서도 호출 시 new 키워드를 앞에 붙임으로써 새로운 인스턴스를 만들어 낼 수 있는 생성자 함수만이 가질 수 있는 프로퍼티이다. 따라서 생성자가 될 수 없는 일반 함수나 객체 리터럴같은 일반객체는 prototype를 프로퍼티로 가지지 않는다.

참조 링크
https://blog.naver.com/tombyun/222415195165
https://poiemaweb.com/js-function

좋은 웹페이지 즐겨찾기