이런 문제를 해결하기 위해 ES6에서는 함수를 사용 목적에 따라 세 가지 종류로 명확히 구분했다.
ES6 함수의 구분 | constructor | prototype | super | argument |
---|---|---|---|---|
일반 함수 | O | O | X | O |
메서드 | X | X | O | O |
화살표 함수 | X | X | X | X |
ES6 사양애서 메서드는 메서드 축약 표현으로 정의된 함수만을 의미한다.
const obj = {
x:1,
// foo는 메서드다.
foo() {return this.x},
bar: function() {return this.x}
};
콜백 함수 내부에서 this가 전역 객체를 가리키는 문제를 해결하기 위한 대안으로 유용하다.
add 메서드를 호출한 prefixer 객체를 가리키는 this를 일단 회피시킨 후에 콜백 함수 내부에서 사용한다.
const Prefixer {
constructor(prefix) {
this.prefix = prefix
}
}
---
add(arr) {
//this를 회피시킨다.
const that = this;
return arr.map(function (item) {
//this 대신 that을 참조한다.
return that.prefix + ' ' + item;
});
}
Array.pretotype.map의 두 번째 인수로 add메서드를 호출한 prefixer 객체를 가리키는 this를 전달한다.
add(arr) {
return arr.map(function (item) {
return this.prefix + ' ' + item;
}, this); // this에 바인딩된 값이 콜백 함수 내부의 this에 반영된다.
}
Function.pretotype.bind 메서드를 사용하여 add메서드를 호출한 prefixer 객체를 가리키는 this를 바인딩한다.
add(arr) {
return arr.map(function (item) {
return this.prefix + ' ' + item;
}.bind(this)); // this에 바인딩된 값이 콜백 함수 내부의 this에 반영된다.
}
ES6에서는 화살표 함수를 사용하여 ‘콜백 내부의 this 문제’를 해결할 수 있다.
class Prefixer {
constructor(prefix) {
this.prefix = prefix;
}
add(arr) {
return arr.map(item => this.prefix + item);
}
}
Function.preotype.call
, Function.preotype.apply
, Function.preotype.bind
메서드를 사용해도 화살표 함수 내부의 this를 교체할 수 없다.화살표 함수는 함수 자체의 super 바인딩을 갖지 않는다. 따라서 화살표 함수 내부에서 super를 참조하면 this와 마찬가지로 상위 스코프의 super를 참조한다.
this와 마찬가지로 상위 스코프의 arguments를 참조한다.
JS엔진은 매개변수의 개수와 인수의 개수를 체크하지 않아 수가 일치하지 않아도 에러가 발생하지 않는다(undefined)
따라서 다음과 같은 방어 코드가 필요하다.
function sum(x = 0, y = 0) {
return x + y;
}
console.log(sum(1,2)); // 3
console.log(sum(1)); // 1