함수와 일급 객체

Yeonn·2024년 2월 18일
0

JavaScript

목록 보기
16/23
post-thumbnail

🎈일급 객체

  • 무명의 리터럴로 생성 가능: 런타임에 생성 가능
  • 변수나 자료구조( 객체, 배열 등 )에 저장 가능
  • 함수의 매개변수에 전달 가능
  • 함수의 반환값으로 사용 가능

✔️함수 ?

함수는 위의 일급 객체의 조건을 모두 만족하므로 일급 객체에 해당한다.

// sayHello 라는 변수에 무명 리터럴 함수를 저장 후 런타임에 함수 객체가 생성 및 할당된다.
const sayHello = function (name) {
  return `hello ${name}!`;
};
const sayBye = function (name) {
	return `bye ${name}!`;
};

// 함수는 객체에 저장이 가능하다.
const greeting = { sayHello, sayBye };

// 함수의 매개변수에 전달하고 반환값으로 사용할 수 있다.
const waveHand = (greeting, name) => {
	let waving = '👋';

	return function (name){
		waving = greeting(name)+ waving;
		return waving;
	};
};

// 함수는 매개변수에 함수를 전달할 수 있다.
const meet = waveHand(greeting.sayHello, 'Tia');
const goHome = waveHand(greeting.sayBye, 'Tia');
console.log(meet('Tia')) // 'hello Tia!👋'
console.log(goHome('Tia')) // 'bye Tia!👋'

일급 객체로서 함수의 특징으로는 일반 객체와 같이 함수의 매개변수에 전달이 가능하고, 함수의 반환값으로 사용이 가능하다는 점이 있다. 반환 값으로 사용이 가능하다는 특징은 함수형 프로그래밍을 가능하게 한다.

✔️ 함수 객체의 프로퍼티

arguments: 함수 호출 시 전달된 인수들의 정보를 담고 있는 순회 가능한 유사 배열 객체( 인자들 ! )
caller: 함수 자신을 호출하는 함수
length: 함수를 정의할 때 선언한 매개변수( parameter )의 개수
name: 함수의 이름
prototype: 모든 객체가 갖는 내부 슬롯

❓ arguments 프로퍼티

arguments 프로퍼티는 함수 호출 시에 전달된 인수들의 정보들이 담겨있는 유사 배열 객체를 말한다. 유사 배열 객체이기 때문에 순회 가능한( iterable ) 특징을 가지고 있지만, 배열은 아니므로 배열 메서드를 사용할 수는 없다.

함수 내부에서는 지역 변수 처럼 사용되지만, 함수의 외부에서는 참조가 불가능하다.

매개변수는 함수 몸체 내부에서 변수와 동일하게 취급된다. 함수 호출 시 몸체 내에서 암묵적으로 매개변수가 선언되고 undefined로 초기화 후 인수가 할당 되다. 이 때, 매개변수가 인수보다 많을 경우, 남은 매개변수는 undefined로 초기화 된 상태가 유지된다. 매개변수가 인수보다 작을 경우 초과된 인수는 무시되고 arguments 객체 프로퍼티로 보관되며, 프로퍼티 키는 인수의 순서대로 지정된다.

매개변수와 인수의 개수를 함수 호출 시에 확인하지 않는 자바스크립트의 특성 때문에, 매개변수의 개수를 확정할 수 없는 가변 인자 함수를 구현할 때 유용하게 쓰인다.

const sum = () => {
  let result = 0;

  for(let i = 0; i<= arguments.length; i ++){
    result += arguments[i];
  }

  return result;
};

✔️ caller 프로퍼티

caller는 함수 자신을 호출하는 함수이다. ECMAScript 사양에 포함되지 않은 비표준 프로퍼티이다.

✔️ name 프로퍼티

name 프로퍼티는 함수의 이름을 나타낸다.

// 기명 함수 표현식
const named = function hello() {};
console.log(named.name); // hello

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

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

✔️ prototype 프로퍼티

[[Prototype]]은 모든 객체가 갖는 내부 슬롯이다. __proto__는 내부 슬롯이 가리키는 프로토타입 객체에 접근하기 위해 사용하는 접근자 프로퍼티 이다. 내부 슬롯에는 직접 접근할 수 없고 간접적인 접근 방법을 제공하는 경우에 한하여 접근할 수 있다.

0개의 댓글