ES6 이전의 함수 구분
- 모든 함수는 일반 함수는 물론 생성자 함수로서 호출 가능 (callable, constructor)
- 메서드(객체에 바인딩된 함수) 또한 일반 함수, 생성자 함수로서 호출 가능
함수 구분 | constructor | prototype | super | arguments |
---|---|---|---|---|
일반 함수 | O | O | X | O |
메서드 | X | X | O | O |
화살표 함수 | X | X | X | X |
const obj = {
x: 1,
foo() { ... }, // 메서드
bar() : function() { ... } // 일반 함수
};
const create = (id, contenet) => ({ id, content });
class Prefixer {
constructor(prefix) { this.prefix = prefix }
add(arr) {
// 여기서 this는 메서드를 호출한 객체 prefixer
arr.map(function (item) {
return this.prefix + item;
// TypeError: Cannot read property 'prefix' of undefined
// 여기서 this는 undefined
});
}
}
const prefixer = new Prefixer('aa');
console.log(prefixer.add(['apple', 'airplane']));
해결 방법
1) this 일단 회피
add(arr) { const that = this; return arr.map(function (item) { return that.prefix + item; }); }
2) 두 번째 인수로 this 전달
add(arr) { return arr.map(function (item) { return this.prefix + item; }, this); }
3) bind 메서드 사용
add(arr) { return arr.map(function (item) { return this.prefix + item; }.bind(this)); }
4) 화살표 함수 사용
- 화살표 함수는 함수 자체의 this 바인딩 X
- 화살표 함수 내부의 this 참조 -> 상위 스코프의 this 그대로 참조
add(arr) { return arr.map(item => this.prefix + item); }
- super, arguments 또한 함수 자체 바인딩 X
-> 상위 스코프 참조
function foo(param, ...rest) {
console.log(param); // 1
console.log(rest); // [2, 3, 4]
console.log(foo.length); // 1
}
foo(1, 2, 3, 4);
// 변환 방법 1
function foo() {
var array = Array.prototype.slice.call(arguments);
console.log(array); // [1, 2, 3, 4]
// 변환 방법 2
function foo(...args) {
console.log(args); // [1, 2, 3, 4]
}
foo(1, 2, 3, 4);
인수가 전달되지 않은 매개변수의 값: undefined
function logName(name = 'Lee') {
console.log(name);
}
logName(); // --- (1) Lee
logName(undefined); // --- (2) Lee
logName(null); // null
logName('Kim'); // Kim