: 함수 호출 방식과 관계없이 this 지정 가능
: 함수 호출 시, call을 사용하고 this로 사용할 객체를 넘기면 해당 함수가 주어진 객체의 메소드인 것 처럼 사용 가능.
함수.call(this객체, 호출 함수로 전달되는 매개변수)
로 사용const j = {
name: "Jane",
}
function showThisName(){
console.log(this.name);
console.log(this);
}
showThisName.call(j);
// Jane
// {name: 'Jane'}
// 매개변수를 받아 객체 정보를 업데이트 하는 함수
const j = {
name: "Jane",
}
//
function update(birthYear, job){
this.birthYear = birthYear;
this.job = job;
}
showThisName.call(j);
update.call(j, 2020, 'singer');
console.log(j);
// {name: 'Jane', birthYear: 2020, job: 'singer'}
: 함수 호출 시, apply를 사용하여 this로 사용할 객체 지정 가능. 단, 매개변수를 배열로 받음.
함수.apply(this객체, 호출 함수로 전달할 매개변수)
const j = {
name: "Jane",
}
//
function update(birthYear, job){
this.birthYear = birthYear;
this.job = job;
}
update.apply(j, [1994, 'teacher']);
console.log(j);
// {name: 'Jane', birthYear: 1994, job: 'teacher'}
const numbers = [2, 67, 4, 15, 100];
const min = Math.min(numbers);
console.log(min);
const numbers = [2, 67, 4, 15, 100];
// Math.min 메소드에 배열을 인수로 줄 수 없음
const min1 = Math.min(numbers);
// Math.min 메소드를 사용하기 위해서는 전개구문을 사용하여 배열을 풀어서 넣어줘야함.
const min2 = Math.min(...numbers);
// this로 사용할 객체는 무엇을 넣어도 상관없음
// 두 번째 매개변수로 배열을 전달하여 사용
const min3 = Math.min.apply(0, numbers);
console.log(min1); // NaN
console.log(min2); // 2
console.log(min3); // 2
// .call() 사용
// .call()의 매개변수로 전개구문을 사용하여 배열을 풀어서 전달
const callMin = Math.min.call("", ...numbers);
console.log(callMin); // 2
const j = {
name: "Jane",
}
//
function update(birthYear, job, ...arr){
this.birthYear = birthYear;
this.job = job;
}
update.apply(j, [1994, 'teacher', 1, 2, 3, 4]);
console.log(j);
//{name: 'Jane', birthYear: 1994, job: 'teacher', arr: Array(4)}
/*
{
arr: (4) [1, 2, 3, 4]
birthYear: 1994
job: "teacher"
name: "Jane"
}
*/
: 함수의 this값을 고정할 수 있음
const m = {
name: "Mike"
}
function update(birthYear, job){
this.birthYear = birthYear;
this.job = job;
}
const updateMike = update.bind(m);
// 새로 바인딩한 함수를 생성
// 새로 만든 함수는 this를 항상 m으로 받음
updateMike(1994, 'teacher');
console.log(m);
// {name: 'Mike', birthYear: 1994, job: 'teacher'}
//update.bind(m)(1940, 'job'); 의 형태로도 사용 가능
call, apply, bind 예제
const user = {
name: '성원',
showNm: function () {
console.log(`hello, ${this.name}`);
},
};
user.showNm(); // "hello, 성원"
let fn = user.showNm;
fn(); // "hello, "
// -> fn에 할당할 때 this를 잃어버림
fn.call(user); // "hello, 성원"
fn.apply(user); // "hello, 성원"
// bind를 사용하여 this지정
const bindFn = fn.bind(user);
console.log('---')
bindFn(); // "hello, 성원"
console.log(fn);
/*
function () {
console.log(`hello, ${this.name}`);
}
*/