call, apply, bind
call, apply, bind method
함수 호출 방식과 관계없이 this를 지정할 수 있음
call
모든 함수에서 사용할 수 있으며 this를 특정값으로 지정할 수 있다.
const mike = {
name: "Mike",
};
const tom = {
name: "Tom",
};
function showThisName() {
console.log(this.name);
}
showThisName(); // 이때 this는 window를 가리킨다. window.name은 빈문자열이다.
showThisName.call(mike); // Mike
함수를 호출하면서 call을 사용하고 this로 사용할 객체를 넘기면 해당 함수가 주어진 객체의 메소드인 것처럼 작동한다.
const mike = {
name: "Mike",
};
const tom = {
name: "Tom",
};
function showThisName() {
console.log(this.name);
}
function update(birthYear, occupation) {
this.birthYear = birthYear;
this.occupation = occupation;
}
update.call(tom, 1994, "학생");
console.log(tom); // {name: 'Tom', birthYear: 2000, occupation: '학생'}
call의 첫번째 매개변수는 this로 사용할 값(tom)이고 매개변수가 더 있으면 그 매개변수로 호출하는 함수(1994, ‘학생’)로 전달된다.
apply
apply 함수 매개변수를 처리하는 방법을 제외하면 call과 완전히 같다.
call은 일반적인 함수와 마찬가지로 매개변수를 직접 받지만 apply는 매개변수를 배열로 받는다.
const mike = {
name: "Mike",
};
function update(birthYear, occupation) {
this.birthYear = birthYear;
this.occupation = occupation;
}
update.apply(mike, [1992, "선생"]);
console.log(mike); // {name: 'Mike', birthYear: 1992, occupation: '선생'}
bind
함수의 this 값을 영구히 바꾼다.
const mike = {
name: "Mike",
};
function update(birthYear, occupation) {
this.birthYear = birthYear;
this.occupation = occupation;
}
const updateMike = update.bind(mike);
updateMike(1959, "백수");
console.log(mike); // {name: 'Mike', birthYear: 1959, occupation: '백수'}
예문 1
const nums = [3, 10, 2, 40, 21];
const minNum = Math.min(nums);
const maxNum = Math.max(nums);
console.log(minNum); // NaN
console.log(maxNum); // NaN
배열을 풀어서 전달해야한다.
const nums = [3, 10, 2, 40, 21];
const minNum = Math.min(...nums);
const maxNum = Math.max(...nums);
console.log(minNum); // 2
console.log(maxNum); // 40
apply 사용
두번째 매개변수로 배열을 전달하면 그 요소들을 차례대로 인수로 사용한다.
const nums = [3, 10, 2, 40, 21];
const minNum = Math.min.apply(null, nums); // null 말고 this, 0, NaN 등 사용가능
const maxNum = Math.max.apply(null, nums);
console.log(minNum); // 2
console.log(maxNum); // 40
call 사용
call은 차례대로 들어와야하니까 … 사용
const minNum = Math.min.call(null, ...nums);
const maxNum = Math.max.call(null, ...nums);
console.log(minNum); // 2
console.log(maxNum); // 40
예문 2
const user = {
name: "Mike",
showName: function () {
console.log(`Hello, ${this.name}`);
},
};
user.showName(); // Hello, Mike
let fn = user.showName;
fn(); // Hello, // fn에 할당할 때 this를 잃어버림
fn.call(user); // Hello, Mike
fn.apply(user); // Hello, Mike
let bindFn = fn.bind(user);
bindFn(); // Hello, Mike
댓글남기기