TIL : ES6 함수의 추가 기능

hihyeon_cho·2023년 3월 28일
0

TIL

목록 보기
89/101
post-thumbnail

1. 함수의 구분

ES6 이전의 함수 호출방법

  1. new 연산자로 호출
  2. 생성자 함수로서 호출
  3. 메서드로서 호출

사용 목적에 따라 명확히 구분되지 않으므로 호출방식에 특별한 제약이 없고,

생성자 함수로 호출되지 않아도 프로토타입 객체를 생성할 수 있음 

ES6 함수의 구분

: 사용 목적에 따라 세가지로 명확히 구분

  • 일반함수 : 함수 선언문이나 함수 표현식으로 정의한 함수 ( ES6 이전의 함수와 동일 )
  • 메서드 : 객체에 바인딩 된 함수 ⇒ 메서드 축약표현으로 정의된 함수
  • 화살표함수 : function 키워드 대신 화살표를 사용하여 간략하게 함수를 정의할 수 있는 방법

2. 메서드

: 객체에 바인딩 된 함수 ⇒ 메서드 축약표현으로 정의된 함수

const obj = {
	x:1,
	foo(){return this.x;},  **// => 메서드**
	bar:function(){return this.x;} // **=> 일반함수**
}

new obj.foo(); // TypeError => non-constructor
new obj.bar();

obj.foo.hasOwnProperty('prototype'); // false
obj.bar.hasOwnProperty('prototype'); // true

super

: ES6 메서드는 자신을 바인딩한 객체를 가리키는 내부슬롯 [[HomeObject]]를 가짐.

super 참조는 [[HomeObject]]를 사용하여 수퍼클래스의 메서드를 참조하기 때문에 super키워드 사용가능.

( ES6 메서드가 아닌 함수는 내부슬롯 [[HomeObject]]이 없어 super 키워드를 사용할 수 없음 )

👉🏻 본연의 기능 **super를 추가**하고 의미적으로 맞지 않는 **constructor기능은 제거**했다. 따라서 메서드를 정의할 때, 프로퍼티 값으로 익명 함수 표현식을 할당하는 방식은 사용하지 않는 것이 좋다.

3. 화살표함수

: function 키워드 대신 화살표를 사용하여 간략하게 함수를 정의할 수 있는 방법으로,

표현뿐만 아니라 내부 동작도 기존의 함수보다 간략하다. ( 일반 함수의 기능을 간략화 )

특히, 콜백함수 내부에서 this가 전역 객체를 가리키는 문제를 해결하기 위한 대안으로 유용하다.

1. 화살표 함수 정의 문법

const multiply = (x, y) => x * y;
multiply(2,3);

const arrow = x => {return const x = 1;};

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

const create = (id, content) => ({id,content}); // 쉼표 연산자문으로 해석.

const sum = (a,b) => {
	const result = a + b;
	return result; // 반환값이 있다면 명시적으로 반환.
}

[1,2,3].map(v=>v*2); 
			// 화살표 함수도 일급객체이므로 고차함수에 인수로 전달할 수 있음.(콜백함수 정의할 때 유용 )

2. 일반함수와의 차이점

  1. 화살표함수는 인스턴스를 생성할 수 없는 non-constructor다. ⇒ prototype 생성 X

  2. 중복된 매개변수 이름을 선언할 수 없다.

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

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

    ⇒ 화살표 함수가 중첩되어 있다면 가장 가까운 상위 함수 중에서 함수가 아닌 함수의 this, arguments, super, new.target을 참조

    • this
      • 화살표함수의 this는 일반함수의 this와 다르게 동작
        콜백함수 내부의 this와 외부함수의 this가 다르기 때문에 발생하는 문제를 해결하기 위해 의도적으로 설계됨.

      • 화살표 함수는 함수 자체의 this 바인딩을 갖지 않기 때문에 화살표 함수 내부에서 this를 참조하면 상위스코프의 this를 그대로 참조한다. ( lexical this = 렉시컬 스코프와 같이 화살표함수의 this가 함수가 정의된 위치에 의해 결정 )

      • 화살표 함수가 중첩되어 있거나 프로퍼티에 할당한 함수라면 가장 가까운 상위 함수 중에서 함수가 아닌 함수의 this를 참조한다.

      • 전역함수라면 화살표 함수의 this는 전역 객체를 가리킨다.

      • .call 이나 .apply, .bind 메서드를 사용해도 화살표 함수내부의 this를 교체할 수 없고 언제나 상위스코프의 this 바인딩을 참조한다.

      • 화살표함수로 메서드를 정의 X ( ES6 메서드 사용. 화살표 함수 내부의 this는 메서드를 호출한 객체를 가리키지 않기 때문. )

      • 프로토 타입 객체의 프로퍼티에 화살표 함수를 할당 X ( 일반 함수 할당 )
        객체가 아닌 ES6 메서드를 동적 추가하고 싶다면 객체 리터럴을 바인딩하고 , 프로토타입의 constructor 프로퍼티와 생성자 함수간의 연결을 재설정한다.
      • 클래스 필드 정의 제안을 사용하여 클래스 필드에 화살표 함수를 할당할 수 있다.
        이 때, 상위 스코프는 클래스 외부이지만 this는 class를 생성할 인스턴스를 참조. constructor내부의 this 바인딩은 클래스가 생성한 인스턴스를 가리키므로, 화살표 함수 내부의 this 또한 클래스가 생성한 인스턴스를 가리키기 때문에 인스턴스 메서드가 된다.
        ES6메서드 사용하는 것이 좋다.


    • arguments
      • 매개변수의 개수를 확정할 수 없는 가변 인자 함수를 구현할 때 유용, 화살표함수에서 사용 X
      • arguments 객체를 참조할 수는 있지만 자신에게 전달 된 인수 목록 확인 할 수 없고, 상위 함수에 전달된 인수목록을 참조함
      • 가변 인자 함수를 구현해야 할 때에는 반드시 Rest 파라미터를 사용해야한다.

constructorprototypesuperarguments 객체
일반함수
메서드❌ ( non-constructor)
화살표함수❌ ( non-constructor)


4. Rest 파라미터

function foo(param, ...rest){
	console.log(param); // 1
	console.log(rest); // [2,3,4,5]
}

foo(1,2,3,4,5)
  • 매개변수 이름 앞에 …을 붙여서 정의한 매개변수. 함수에 전달된 인수들의 목록을 배열로 전달받음.

  • 일반 매개변수와 함께 사용할 수 있으며, 이 때 전달된 인수들은 매개변수와 Rest 파라미터에 순차적으로 할당된다.

  • 반드시 마지막 파라미터여야 하며, 단 하나만 선언할 수 있다.

  • .length 프로퍼티에 영향을 주지않는다.

  • arguments 객체는 배열이 아닌 유사 배열 객체이므로 배열 메서드를 사용하려면 .call 이나 .apply 메서드로 arguments 객체를 배열로 변환해야하는 번거로움이 있었는데 rest 파라미터를 사용하여 인수 목록을 배열로 직접 전달 받을 수 있으면서 번거로움을 피할 수 있다.

  • 함수와 ES6 메서드는 arguments 객체와 Rest 파라미터 모두 사용가능하지만, 화살표 함수는 arguments 객체를 갖지 않기 때문에 반드시 Rest 파라미터를 사용해야한다.

5. 매개변수 기본값

  • 자바스크립트 엔진은 매개변수의 개수와 인수의 개수를 체크하지 않는다. 그렇기 때문에 매개변수의 개수만큼 인수를 전달하지 않아도 에러가 발생한다. 이 때, 전달되지 않는 매개변수의 값은 undefined이다. 그러므로 매개변수에 기본값을 할당할 필요가 있는데, ES6에서 도입된 매개변수 기본 값을 사용하면 함수 내에서 수행하던 인수 체크 및 초기화를 간소화할 수 있다.
function sum(x,y){
	x = x || 0;
	y = y || 0;

	return x + y;
}
function sum(x = 0,y = 0){
	return x + y;
}
  • 매개변수 기본 값은 매개변수에 인수를 전달하지 않은 경우와 undefined 를 전달한 경우에만 유효하며, Rest 파라미터에는 기본값을 지정할 수 없다.
  • 이는 함수 정의 시 선언한 매개변수 개수를 나타내는 함수 객체의 .length 프로퍼티와 arguments 객체에 영향을 주지않는다.
profile
코딩은 짜릿해 늘 새로워 ✨

0개의 댓글