seunghyun Note

26장 (ES6 함수의 추가 기능) 본문

스터디/모던자바스크립트 deep dive

26장 (ES6 함수의 추가 기능)

승숭슝현 2024. 1. 8. 10:35

1. 함수의 구분

ES6 이전까지 자바스크립트의 함수는 별다른 구분 없이 다양한 목적으로 사용되었다. 자바스크립트의 함수
는 일반적인 함수로서 호출할 수도 있고,new 연산자와 함께 호출하여 인스턴스를 생성할 수 있는 생성자 함

var foo = function () {
  return 1;
};

// 일반적인 함수로서 호출
foo(); // -> 1

// 생성자 함수로서 호출
new foo(); // -> foo {}

// 메서드로서 호출
var obj = { foo: foo };
obj.foo(); // -> 1

객체에 바인딩된 함수를 생성자 함수로 호출하는 경우가 흔치는 않겠지만 문법상 가능하다는 것은 문제가 있다. 그리고 이는 성능 면에서도 문제가 있다. 객체에 바인딩된 함수가 constructor 라는 것은 객체에 바인딩된 함수가 prototype 프로퍼티를 가지며,프로토타입 객체도 생성한다는 것을 의미하기때문.

함수에 전달되어 보조 함수의 역할을 수행하는 클백 함수도 마찬가지다. 클백 함수도 constructor 이기 때문에 불필요한 프로토타입 객체를 생성

// 프로퍼티 f에 바인딩된 함수는 callable이며 constructor다.
var obj = {
  x: 10,
  f: function () { return this.x; }
};

// 프로퍼티 f에 바인딩된 함수를 메서드로서 호출
console.log(obj.f()); // 10

// 프로퍼티 f에 바인딩된 함수를 일반 함수로서 호출
var bar = obj.f;
console.log(bar()); // undefined

// 프로퍼티 f에 바인딩된 함수를 생성자 함수로서 호출
console.log(new obj.f()); // f {}

2. 메서드

ES6 사양에서 메서 드는 메서드 축약 표현으로 정의된 함수만을 의미


const obj = {
  x: 1,
  // foo는 메서드이다.
  foo() { return this.x; },
  // bar에 바인딩된 함수는 메서드가 아닌 일반 함수이다.
  bar: function() { return this.x; }
};

console.log(obj.foo()); // 1
console.log(obj.bar()); // 1

ES6 사양에서 정의한 메서드(이하 ES6 메서드)는 인스턴스를 생성할 수 없는 non-constructor다. 따라서 ES6 메서드는 생성자 함수로서 호출할 수 없다

new obj.foo(); // -> TypeError: obj.foo is not a constructor
new obj.bar(); // -> bar {}

ES6 메서드는 자신을 바인딩한 객체를 가리키는 내부 슬롯 [[HomeObject]]를 갖는다. super 참조는 내
부 슬롯 [[HomeObject]]를 사용하여 수퍼클래스의 메서드를 참조하므로 내부 슬롯 [[HomeObject]]를 갖는
ES6 메서드는super 키워드를사용할수있다

const base = {
  name: 'Lee',
  sayHi() {
    return `Hi! ${this.name}`;
  }
};

const derived = {
  __proto__: base,
  // sayHi는 ES6 메서드다. ES6 메서드는 [[HomeObject]]를 갖는다.
  // sayHi의 [[HomeObject]]는 sayHi가 바인딩된 객체인 derived를 가리키고
  // super는 sayHi의 [[HomeObject]]의 프로토타입인 base를 가리킨다.
  sayHi() {
    return `${super.sayHi()}. how are you doing?`;
  }
};

console.log(derived.sayHi()); // Hi! Lee. how are you doing?

3. 화살표 함수

화살표 함수는 표현만 간략한 것이 아니라 내부동작도 기존의 함수보다 간략하다.
특히 화살표 함수는 콜백 함수 내부에서 this가 전역 객체를 가리키는 문제를 해결하기 위한 대안으로 유용하다.

const arrow = () => { ... };

화살표 함수는 자체의 this, arguments, super, new.target 바인딩을 갖지 않는다.

따라서 화살표 함수 내부에서 this, arguments, super, new.target을 참조하면 스코프 체인을 통해 상위 스코프의 this, arguments, super, new.target을 참조한다.

만약 화살표 함수와 화살표 함수가 중첩되어 있다면 상위 화살표 함수에도 this, arguments, super, new.target 바인딩이 없으므로 스코프 체인 상에서 가장 가까운 상위 함수 중에서 화살표 함수가 아닌 함수의 this, arguments, super, new.target을 참조한다.

4. Rest 파라미터

함수에 전달된 인순들의 목록을 배열로 전달받는 건데, 매개변수 이름앞에 ...을 붙여서 정의한 매겨변수를 의미

  1. Rest 파라미터는 함수 정의시 선언한 매개변수 개수를 나타내는 함수 객체의 length에 영향을 끼치지 않는다.
  2. 가변 인자 함수의 인수 목록을 배열로 직접 전달받을 수 있어서 배열 메소드를 사용할 수 있다.
  3. 매개변수 기본 값을 통해 방어코드를 따로 작성안해도 된다.
728x90

'스터디 > 모던자바스크립트 deep dive' 카테고리의 다른 글

28장(Number)  (1) 2024.01.08
27장(배열)  (1) 2024.01.08
25장(클래스)  (0) 2024.01.08
24장 (클로저)  (0) 2024.01.08
23장 (실행 컨텍스트)  (1) 2024.01.08