Javascript Study

call, apply, bind

eddie0329 2020. 10. 18. 22:56
๋ฐ˜์‘ํ˜•

๐Ÿ“Œ ๋ชฉ์ฐจ

  • Introduction
  • What is call?
  • What is apply?
  • What is bind?
  • Usage
  • Conclusion
  • Reference

๐Ÿ“Œ Introduction

์•ˆ๋…•ํ•˜์„ธ์š”. ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ๊ฐ€์žฅ ํ—ท๊ฐˆ๋ฆฌ๋Š” call, apply, bind์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ What is call?

๋จผ์ € call์„ ์ •์˜ํ•˜๊ธฐ ์ „์— ํ•ด๋‹น ์˜ˆ์ œ๋ฅผ ๋ด์ฃผ์„ธ์š”.

const example = (a, b, c) => {
  console.log(a + b + c);
};
example(1, 2, 3); // 6
example.call(null, 1, 2, 3); // 6

example์„ ์‹คํ–‰์‹œํ‚จ ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ example.call๋„ ๋˜‘๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๋ˆˆ์น˜๋ฅผ ์ฑ„์‹ ๋ถ„๋„ ์žˆ๊ฒ ์ง€๋งŒ call์˜ ์ฒซ๋ฒˆ ์งธ ์ธ์ž ๋’ค์—๋Š” example์— ๋“ค์–ด๊ฐ€๋Š” ์ธ์ž๋ฅผ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด null์€ ๋ฌด์—‡์ผ๊นŒ์š”? ์ •๋‹ต์€ ๋ฐ”๋กœ this๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

const obj1 = {
  name: 'eddie',
  greeting: function () {
    console.log(`Hi, ${this.name}`);
  },
};

const obj2 = {
  name: 'claire',
};

obj1.greeting(); // Hi, eddie
obj1.greeting.call(obj2); // Hi, claire

์ด๋ ‡๊ฒŒ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ this๋ฅผ ๋Œ€์ฒด ์‹œ์ผœ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ What is apply?

apply๋„ call๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

const example = (a, b, c) => {
  console.log(a + b + c);
};
example.apply(null, [1, 2, 3]); // 6

call๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋Š” this๋ฅผ ๋Œ€์ฒดํ•˜๋Š”๊ฒƒ์ด๊ณ  call๊ณผ ๋‹ค๋ฅธ์ ์€ ๋‘๋ฒˆ์งธ ์ธ์ž์— array๋กœ example์— ๋“ค์–ด๊ฐ€๋Š” ์ธ์ž๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

const obj1 = {
  name: 'eddie',
  greeting: function () {
    console.log(`Hi, ${this.name}`);
  },
};

const obj2 = {
  name: 'claire',
};

obj1.greeting.apply(obj2); // Hi, claire

๐Ÿ“Œ What is bind?

๊ทธ๋ ‡๋‹ค๋ฉด bind๋Š” ๋ญ˜๊นŒ์š”? call๊ณผ apply ์ฒ˜๋Ÿผ this๋ฅผ ๋Œ€์ฒดํ•œ๋‹ค๋Š” ์ ์—์„  ๊ฐ™์ง€๋งŒ ์‹คํ–‰์„ ์‹œ์ผœ์ฃผ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ํ•œ๋ฒˆ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

const obj1 = {
  name: 'eddie',
  greeting: function () {
    console.log(`Hi, ${this.name}`);
  },
};

const obj2 = {
  name: 'claire',
};

const greetingClaire = obj1.greeting.bind(obj2);
greetingClaire(); // Hi, claire

์ด ์ฒ˜๋Ÿผ call๊ณผ apply๋Š” ๋ฐ”๋กœ ์‹คํ–‰์„ ์‹œ์ผœ์ฃผ๋Š” ๋ฐ˜๋ฉด bind๋Š” this๋งŒ ๋ฐ”๊ฟ”์ค€ ํ˜•ํƒœ๋กœ return์„ ์‹œ์ผœ์ค๋‹ˆ๋‹ค.

๐Ÿ“Œ Usage

call, apply, bind๋Š” ์ด๋Ÿฐ์‹์œผ๋กœ๋„ ์‘์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

function example2() {
  console.log(arguments.join()); // error;
}

์œ„์˜ ์ฝ”๋“œ๋Š” arguments๊ฐ€ ์œ ์‚ฌ ๋ฐฐ์—ด์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ์ ์œผ๋กœ๋Š” ๋ฐฐ์—ด์˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ call์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋‹ฌ๋ผ์ง€์ฃ .

function example2() {
  console.log(Array.prototype.join.call(arguments));
}

example2('eddie', 2, true); // eddie,2,true

๐Ÿ“Œ Conclusion

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ž์ฃผ ์“ฐ์ด์ง€๋Š” ์•Š์ง€๋งŒ context๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” call, apply, bind์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. this๋ผ๋Š” ๊ฒƒ์€ ํ•ญ์ƒ ๊นŒ๋‹ค๋กญ๊ธฐ ๋–„๋ฌธ์— ์•Œ๊ณ  ์žˆ์œผ๋ฉด ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“ŒReference

๋ฐ˜์‘ํ˜•