js

javascript ๋ฉ”์„œ๋“œ call, apply, bind

์œถโ‰ 2022. 10. 31. 17:37

*call, apply, bind: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ• ์™ธ์—๋„ ํ•จ์ˆ˜๋ฅผ ์–ด๋””์„œ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœํ–ˆ๋Š”์ง€์™€ ๊ด€๊ณ„์—†์ด this๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ

 

*call: ๋ชจ๋“  ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ this๋ฅผ ํŠน์ •๊ฐ’์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ

ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ call์„ ์‚ฌ์šฉํ•˜๊ณ , this๋กœ ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ๋„˜๊ธฐ๋ฉด ํ•ด๋‹นํ•จ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

call์˜ ์ฒซ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” this๋กœ ์‚ฌ์šฉํ•  ๊ฐ’์ด๊ณ  ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๋กœ ์ „๋‹ฌ๋จ

const mike = {
  name: "Mike",
};
const tom = {
  name: "Tom",
};

function showThisName(){
  console.log(this.name);
} //์—ฌ๊ธฐ์„œ this๋Š” window๋ฅผ ๊ฐ€๋ฆฌํ‚ด
showThisName();
showThisName.call(mike);//Mike

 

์˜ˆ์‹œ) ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜

- ๊ฐ์ฒด์— ์ •๋ณด๊ฐ€ ์—…๋ฐ์ดํŠธ ๋จ. ์ฒซ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” 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(mike, 1999, 'singer')
console.log(mike); //{name: 'Mike', birthYear: 1999, occupation: 'singer'}

 

*apply: ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ์™ธํ•˜๋ฉด call๊ณผ ์™„์ „ํžˆ ๊ฐ™์Œ. call์€ ์ผ๋ฐ˜์ ์ธ ํ•จ์ˆ˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง์ ‘ ๋ฐ›์ง€๋งŒ, apply๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฐ›์Œ. 

- []๋กœ ๋ฌถ์–ด์ฃผ์ง€ ์•Š์œผ๋ฉด ์—๋Ÿฌ๋œธ

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.apply(mike, [1999, 'singer'])
console.log(mike); //{name: 'Mike', birthYear: 1999, occupation: 'singer'}
update.apply(tom, [2000, 'teacher'])
console.log(tom); //{name: 'Tom', birthYear: 2000, occupation: 'teacher'}

- ๋ฐฐ์—ด ์š”์†Œ๋ฅผ ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ๋•Œ ์œ ์šฉ
-> ... ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ

const nums = [3,10,1,6,4];
const minNum = Math.min(...nums);
const maxNum = Math.max(...nums);

console.log(minNum); //1
console.log(maxNum); //10

-> apply ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ: ๋‘๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐฐ์—ด๋กœ ์ „๋‹ฌํ•˜๋ฉด ๊ทธ ์š”์†Œ๋“ค์„ ์ฐจ๋ก€๋Œ€๋กœ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•จ

null์€ this๋กœ ์‚ฌ์šฉํ•  ๊ฐ’์ธ๋ฐ ์—ฌ๊ธฐ์„œ๋Š” Math.min์ด๋‚˜ Math.max๋Š” ๋”ฑํžˆ this๊ฐ’์ด ํ•„์š”ํ•˜์ง€ ์•Š์•„ ์•„๋ฌด๊ฐ’ ๋„ฃ์€ ๊ฒƒ

const nums = [3,10,1,6,4];
const minNum = Math.min.apply(null,nums); 
// = Math.min.apply(null, [3,10,1,6,4])
const maxNum = Math.max.apply(null,nums);
console.log(minNum); //1
console.log(maxNum); //10

โ—Ž call๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ( ...nums๋กœ ์”€)

const nums = [3,10,1,6,4];
const maxNum = Math.max.call(null,...nums);
// = Math.min.call(null, [3,10,1,6,4])
console.log(minNum); //1
console.log(maxNum); //10

*bind: ํ•จ์ˆ˜์˜ this๊ฐ’์„ ์˜๊ตฌํžˆ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Œ

const mike = {
  name: "Mike",
};

function update(birthYear, occupation){
  this.birthYear = birthYear;
  this.occupation = occupation;
};

const upadteMike = update.bind(mike); //์ด ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ mike๋ฅผ this๋กœ ๋ฐ›์Œ
upadteMike(1999, "singer");
console.log(mike); //{name: 'Mike', birthYear: 1999, occupation: 'singer'}

์˜ˆ์‹œ)

- fn์„ ํ• ๋‹นํ•  ๋•Œ this๋ฅผ ์žƒ์–ด๋ฒ„๋ฆฐ ๊ฒฝ์šฐ ๊ฐ’์ด ๋œจ์ง€ ์•Š์Œ. (๋ฉ”์„œ๋“œ๋Š” .showName ์•ž์— ์žˆ๋Š”๊ฒŒ this(user)์ž„) ํ˜ธ์ถœํ•  ๋•Œ fn๋งŒ ํ˜ธ์ถœํ•˜๊ณ  this๊ฐ€ ์—†๋Š” ์ƒํƒœ

const user = {
  name: "Mike",
  showName: function(){
    console.log(`hello, ${this.name}`);
  },
};
user.showName(); //hello, Mike
let fn = user.showName;
fn(); // hello,

- call์„ ์‚ฌ์šฉํ•ด this๋กœ ์‚ฌ์šฉํ•  ๊ฐ’ user๋ฅผ ๋„ฃ์Œ

const user = {
  name: "Mike",
  showName: function(){
    console.log(`hello, ${this.name}`);
  },
};
user.showName(); //hello, Mike
let fn = user.showName;
fn.call(user); // hello, Mike

-apply๋ฅผ ๋„ฃ์–ด๋„ ๋™์ผ

const user = {
  name: "Mike",
  showName: function(){
    console.log(`hello, ${this.name}`);
  },
};
user.showName(); //hello, Mike
let fn = user.showName;
fn.apply(user); // hello, Mike

- bind๋ฅผ ์ด์šฉํ•ด ์ƒˆ ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

const user = {
  name: "Mike",
  showName: function(){
    console.log(`hello, ${this.name}`);
  },
};
user.showName(); //hello, Mike
let fn = user.showName;
fn.apply(user); // hello, Mike

let boundFn = fn.bind(user);
boundFn();