언어/WEB

18장 모던 자바스크립 함수와 일급 객체

앨리스.W 2023. 6. 13. 21:41

일급객체

<조건>

무명의 리터럴로 생성할 수 있다. 즉 런타임에 생성이 가능하다

변수난 자료구조(객체,배열 등)에 저장할 수 있다

함수의 매개변수에 전달할 수 있다

함수의 반환값으로 사용할 수 있다

//1.함수는 무명의 리터럴로 생성할 수 있다.
//2.함수는 변수에 저장할 수 있다.
const increase = function (num) {
     return ++num;
};

const decrease = function (num) {
     return --num;
}

//2.함수는 객ㅊ체에 저장할 수 있다.
const auxs = {increase, decrease};

//3.함수는 매개변수에 전달할 수 있다.
function makeCounter(aux) {
   let num = 0;
   
   return function () {
      num = aux(num);
      return num;
   };
}

//3.함수는 매개변수에게 함수를 전달할 수 있다.
const increaser = makeCounter(auxs.increase);
console.log(increase()); // 1
console.log(increase()); // 2

const increaser = makeCounter(auxs.decrease);
console.log(decrease()); // -1
console.log(decrease()); // -2

함수는 객체와 동일하다

함수는 값을 사용할 수 있는 곳이라면 어디든 사용 가능

함수는 매개변수와 반환값으로 사용 가능

함수 객체의 프로퍼티

Object.getOwnPropertyDescriptors 메서드를 사용하면 함수의 프로퍼티 확인할 수 있다

arguments, caller, length, name, prototype은 함수 객체의 프로퍼티이지만

__proto__ 접근자 프로퍼티는 Object.prototype 객체로부터 상속받음

arguments

함수 호출 시 전달된 인수들의 정보를 담고 있는 순회 가능한 유사 배열 객체이며,

함수 내부에서 지역 변수처럼 사용된다.

매개 변수가 부족하면 undefined로 더 많으면 초과된 인수는 무시(arguments에 저장)

매개 변수 개수를 확정할 수 없는 가변 인자 함수를 구현할때 유용

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

console.log(sum()); //0
console.log(sum(1,2)); //3
console.log(sum(1,2,3)); //6


//배열은 아니기때문에 배열 메서드를 사용할려면 Function.prototype.call과 Function.prototype.apply를 사용해야한다
function sum() {
  const array = Array.prototype.slice.call(arguments);
  return array.reduce(function(pre, cur) {
     return pre + cur;
   },0);
}

// Rest 파라미터 사용
function sum(...args) {
   return args.reduce((pre, cur) => pre + cur, 0);
}

caller 프로퍼티

함수 자신을 호출하는 함수 

안씀

length 프로퍼티

함수를 정의할 때 선언한 매개변수의 개수를 가리킴

arguments 객체의 length 프로퍼티와 함수 객체의 length 프로퍼티의 값은 다를 수 있으므로 주의

name 프로퍼티

함수 이름을 의미

ES5에서 name 프로퍼티는 빈 문자열, ES6에서 함수 객체를 가리키는 식별자를 값으로 갖는다

var anony = function() {};
console.log(anony.name)

__proto__ 접근자 프로퍼티

[[Prototype]] 내부 슬롯이 가리키는 프로토타입 객체에 접근하기 위해 사용하는 접근자

프로퍼티다. 간접 접근용임

prototype 프로퍼티

생성자 함수로 호출할 수 있는 함수 객체, 즉 construtor만이 소유하는 프로퍼티다.

(function () {}).hasOwnProperty('prototype');//true
({}).hasOwnProperty('prototype');

 

 

반응형