본문 바로가기

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

#26. ES6 함수의 추가 기능

1. 함수의 구분

  • ES6 이전의 함수는 동일한 함수라도 다양한 형태로 호출할 수 있다.
    (일반적인 함수 호출 / 생성자 함수로서 호출 / 객체에 바인딩되어 메서드로서 호출)  
    => ES6 이전의 모든 함수는 callable이면서 constructor이다.
  • 객체에 바인딩 된 함수도 callable이며 constructor이다. 즉, 객체에 바인딩된 함수도 일반 함수로서 호출할 수 있는 것은 물론 생성자 함수로서 호출할 수 있는 것!
    • 객체에 바인딩된 함수가 constructor라는 것은 객체에 바인딩된 함수가 prototype 프로퍼티를 가지며, 프로토타입 객체도 생성한다는 것을 의미한다.
      => 사용 목적에 따라 명확한 구분이 없으므로 생성자 함수로 호출되지 않아도 프로토타입 객체를 생성하기 때문에 실수 유발 가능성이 높다!!!
  • 이 문제를 해결하기 위해 ES6에서는 함수를 사용 목적에 따라 세 가지 종류로 구분했다.

일반 함수 : 함수 선언문이나 함수 표현식으로 정의한 함수를 의미한다. (ES6 이전의 함수와 차이가 없음)
  • 일반 함수는 constructor, ES6의 메서드와 화살표 함수는 non-constructor

 

2. 메서드

  • ES6 사양에서 메서드는 메서드 축약 표현으로 정의된 함수만을 의미한다.
    • ES6 메서드는 인스턴스를 생성할 수 없는 non-constructor다.
    • 인스턴스를 생성할 수 없으므로 prototype 프로퍼티가 없고 프로토타입도 생성하지 않음
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

 

3. 화살표 함수

  • 화살표 함수는 function 키워드 대신 화살표(=>)를 사용하여 기존의 함수 정의 방식보 다 간략하게 함수를 정의할 수 있다.

화살표 함수 정의

  • 화살표 함수는 함수 표현식으로 정의
  • 매개변수가 여러 개인 경우 소괄호 안에 매개변수 선언, 한 개인 경우 소괄호 생략, 매개변수가 없어도 소괄호는 필수
  • 함수 body가 하나의 문으로 구성된 표현식이라면 중괄호 {} 생략 가능, 이 때 함수 몸체 내부의 문이 값이 암묵적으로 반환 (표현식이 아니라면 중괄호 생략 시 에러 발생)
  • 객체 리터럴을 반환하는 경우 객체 리터럴을 소괄호로 감싸주어야 함

화살표 함수와 일반 함수의 차이

  • 화살표 함수는 인스턴스를 생성할 수 없는 non-constructor다.
  • 중복된 매개변수 이름을 선언할 수 없다.
  • 화살표 함수는 함수 자체의 this, arguments, super, new.target 바인딩을 갖지 않는다.

this

  • 화살표 함수의 this는 일반 함수의 this와 다르게 동작한다.
  • 화살표 함수는 함수 자체의 this 바인딩을 갖지 않는다. 따라서 화살표 함수 내부에서 this를 참조하면 상위 스코프의 this를 그대로 참조한다. => 이를 lexical this라고 함

super

  • 화살표 함수는 함수 자체의 super 바인딩을 갖지 않으므로 화살표 함수 내부에서 super를 참조하면 this와 마찬가지로 상위 스코프의 super를 참조한다.

arguments

  • 화살표 함수는 함수 자체의 arguments 바인딩을 갖지 않으므로 화살표 함수 내부에서 arguments를 참조하면 this와 마찬가지로 상위 스코프의 arguments를 참조한다.

 

4. Rest 파라미터

기본 문법

  • Rest 파라미터(나머지 매개변수)는 매개변수 이름 앞에 세개의 점 … 을 붙여서 정의한 매개변수를 의미
  • Rest 파라미터는 함수에 전달된 인수들의 목록을 배열로 전달받음
unction foo( ... rest) { 
// 매개변수 rest는 인수들의 목록을 배열르 전달받는 Rest 파라미터다. 
console.log(rest); //  [ 1, 2, 3, 4, 5 ] 
} 
foo(1, 2, 3, 4, 5);
  • 일반 매개변수와 Rest 파라미터는 함께 사용 가능
  • 이 때 함수에 전달된 인수들은 매개변수와 Rest 파라미터에 순차적으로 할당됨
  • Rest 파라미터는 반드시 마지막 파라미터여야 하며, 단 하나만 선언할 수 있다.
function foo(param, ... rest) { 
console.log(param); // 1 
console.tog(rest); // [ 2, 3, 4, 5 ]
foo(1, 2, 3, 4, 5);
  • Rest 파라미터는 함수 정의 시 선언한 매개변수 개수를 나타내는 함수 객체의 length 프로퍼티에 영향을 주지 않는다.

Rest 파라미터와 arguments 객체

  • ES5 ) 함수를 정의할 때 매개변수의 개수를 확정할 수 없는 가변 인자 함수의 경우 매개변수를 통해 인수를 전달받는 것이 불가능하므로 arguments 객체를 활용하여 인수를 전달받았음
    • arguments 객체는 함수 호출 시 전달된 인수들의 정보를 담고 있는 순회 가능한 유사 배열 객쳬이며, 함수 내부에서 지역 변수처럼 사용 가능
      => 하지만 arguments 객체는 배열이 아닌 유사 배열 객체이므로 배열 메서드를 사용하려면 Function.prototype. call이나 Function.prototype.apply 메서드를 사용해 arguments 객체를 배열로 변환해야 하는 번거로움이 존재!!
  • ES6 ) rest 파라미터를 사용하여 가변 인자 함수의 인수 목록 을 배열로 직접 전달받을 수 있고, 이를 통해 유사 배열 객체인 arguments 객체를 배열로 변환하는 번거로움을 피할 수 있다.

 

5. 매개변수 기본값

  • 매개변수에 인수를 전달하지 않은 경우와 undefined을 전달한 경우, 아래 코드와 같이 매개변수 기본값이 적용될 수 있다.
unction sum(x = 0, y = 0) { 
return x + y; 
} 
console.log(sum(1, 2)); // 3 
console.log(sum(1)); // 1

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

#35. 스프레드 문법  (0) 2024.09.07
#27. 배열  (0) 2024.08.18
#25. 클래스  (0) 2024.06.01
#24. 클로저  (0) 2024.05.25
#23. 실행 컨텍스트  (0) 2024.05.25