[모던 자바스크립트 Deep dive] Study - 18장 함수와 일급 객체

n-u·2022년 5월 2일
0
post-thumbnail

18. 함수와 일급 객체

18.1 일급 객체

  1. 무명의 리터럴로 생성할 수 있다. 즉, 런타임에 생성이 가능하다
  2. 변수나 자료구조(객체, 배열 등)에 저장할 수 있다.
  3. 함수의 매개변수에 전달 할 수 있다.
  4. 함수의 반환값으로 사용할 수 있다.
  • 자바스크립트의 함수는 일급 객체이다.

일급 객체로서 함수가 가지는 특징

  1. 값으로 사용할 수 있다.(변수 할당문, 객체의 프로퍼티 값, 배열의 요소, 함수 호출의 인수, 함수 반환문)
  2. 함수의 매개변수에 전달 할 수 있다.
  3. 함수의 반환값으로 사용 가능
  4. 함수객체는 호출 할 수 있다.(일반객체는 호출할 수 없다)
  5. 함수의 고유 프로퍼티를 가지게 된다.

18.2 함수 객체의 프로퍼티

함수는 객체이다.

함수 고유 프로퍼티 : arguments, caller, length, name, prototype

  • __proto__ : 접근자 프로퍼티(Object.prototype)객체의 프로퍼티를 상속받은 것

18.2.1 argument 프로퍼티

argument 프로퍼티 값argument 객체다.
argument 객체는 함수 호출 시 전달된 인수들의 정보를 담고 있는 순회 가능한 유사배열 객체이며, 함수 내부에서 지역 변수처럼 사용된다.

매개변수와 인수

1. 선언된 매개변수 > 인수
: 인수가 전달되지 않아 전달 되지 않은 매개변수의 값은 undefined로 초기화 상태로 유지
2. 선언되 매개변수 < 인수
: 초과된 인수는 무시되며, 모든 인수는 암묵적으로 argument 객체의 프로퍼티로 보관된다.

argument.length프로퍼티

인수의 개수를 가리킨다.

  • 매개변수 개수를 확정할 수 없는 가변 인자 함수를 구현할때 유용하다.
  • 배열 객체로 length프로퍼티를 가진 객체로 for문으로 순회할 수 있는 객체를 말한다.

인수의 개수를 확인하지 않은 자바스크립트 특성상 개수를 확인하고 이에 따른 함수의 동작을 정의 할 필요가 있다.

function sum(){
  let res = 0;
  
  for(let i = 0; i<argument.length; i++){
    res += argument[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를 사용해 간접적 호출 할 수 있으나, 번거롭다.

Rest 파라미터

ES6이후 배열메서드를 사용하기 위한 불편함을 해소하기 위해 생겨났다.

//ES6 Rest Parameter
function sum(...args){
  return args.reducd((pre,cur)=> pre + cur, 0);
}
console.log(sum(1,2));	//3
console.log(sum*1,2,3,4,5));	//15
참고
  • console.dir메서드를 이용해 함수 객체 내부를 볼 수 있다.
  • Object.getOwnPropertyDescriptors 메서드로 모든 프로퍼티 어트리뷰트를 확인 가능하다.

18.2.2 caller 프로퍼티

ECMASCript 사양에 포함되지 않은 비표준 프로퍼티임


18.2.3 length 프로퍼티

함수를 정의할때 선언한 매개변수의 개수를 가르킨다.

  • argument.length프로퍼티(인자의 개수)와 다르다.
function foo(){};
console.log(foo.length);	//0

function bar(x,y){
  return x *y;
}
console.log(bar.length);	//2

18.2.4 name 프로퍼티

함수 이름을 나타낸다.
함수 객체를 가리키는 식별자를 값으로 갖는다.

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

//익명 함수 표현식
var anonymousFunc = function(){};
//ES5 : name 프로퍼티는 빈문자열을 값을 갖는다.
//ES6 : name 프로퍼티는 함수 객체를 가리키는 변수 이름을 값으로 갖는다.
console.log(anonymousFunc.name);	//anonymousFunc

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

18.2.5 __ porto__ 접근자 프로퍼티

모든 객체는 [[prototype]]의 내부 슬롯을 갖는다.
이 내부 슬롯에 직접 접근할 수 없는데 간접적으로 접근하기 위해 사용하는 접근자 프로퍼티이다.


18.2.6 prototype 프로퍼티

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

  • 함수가 객체를 생성하는 생성자 함수로 호출될 때 생성자 함수가 생성할 인스턴스의 프로토타입 객체가 된다.




18장을 마치며...

자바스크립트의 함수는 일급객체이지만 일급객체의 조건은 무명함수일때 인데 함수 선언문으로 정의한 함수는 일급객체인것인지 아닌지건지....기명함수로 된 함수가 변수의 값으로 들어가 있는 경우가 있는데 이럴때에는 선언문으로 정의된 함수는 일급객체인 것인가???? 표현식인 건가???
그러면 선언문으로 정의된 함수는 뭐지????

이해가 되지 않은 부분이 있는데 해결하기에는 내 배움이 짧은 것 같다. 일단은 큰 그림을 잡고 공부하는 방향으로 개념을 알고 다시 볼때 알아보는 것으로 해야할 것 같다.

profile
기록하며 발전하는 삶

0개의 댓글