1. 함수의 구분
- ES6 이전의 함수는 동일한 함수라도 다양한 형태로 호출할 수 있다.
(일반적인 함수 호출 / 생성자 함수로서 호출 / 객체에 바인딩되어 메서드로서 호출)
=> ES6 이전의 모든 함수는 callable이면서 constructor이다. - 객체에 바인딩 된 함수도 callable이며 constructor이다. 즉, 객체에 바인딩된 함수도 일반 함수로서 호출할 수 있는 것은 물론 생성자 함수로서 호출할 수 있는 것!
- 객체에 바인딩된 함수가 constructor라는 것은 객체에 바인딩된 함수가 prototype 프로퍼티를 가지며, 프로토타입 객체도 생성한다는 것을 의미한다.
=> 사용 목적에 따라 명확한 구분이 없으므로 생성자 함수로 호출되지 않아도 프로토타입 객체를 생성하기 때문에 실수 유발 가능성이 높다!!!
- 객체에 바인딩된 함수가 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 객체를 배열로 변환해야 하는 번거로움이 존재!!
- 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 |