๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
JavaScript/JavaScript

[JavaScript] call, apply, bind

by ์ฝ”๋”ฉํ•˜๋Š” ๋ถ•์–ด 2021. 10. 23.
๋ฐ˜์‘ํ˜•

๐Ÿฉ call

๋ฉ”์„œ๋“œ์˜ ํ˜ธ์ถœ ์ฃผ์ฒด์ธ ํ•จ์ˆ˜๋ฅผ ์ฆ‰์‹œ ์‹คํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ๋ช…๋ น

Function.prototype.call(thisArg[, arg1[, arg2[, ...]]])

์ด๋•Œ call ๋ฉ”์„œ๋“œ์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋ฅผ this๋กœ ๋ฐ”์ธ๋”ฉํ•˜๊ณ , ์ดํ›„์˜ ์ธ์ž๋“ค์„ ํ˜ธ์ถœํ•  ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•œ๋‹ค.
ํ•จ์ˆ˜๋ฅผ ๊ทธ๋ƒฅ ์‹คํ–‰ํ•˜๋ฉด this๋Š” ์ „์—ญ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜์ง€๋งŒ call ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด ์ž„์˜์˜ ๊ฐ์ฒด๋ฅผ this๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

// call ๋ฉ”์„œ๋“œ-1

var func = function (a, b, c) {
  console.log(this, a, b, c);
};

func(1, 2, 3);                 // Window{ ... } 1 2 3
func.call({ x: 1 }, 4, 5, 6);  // { x: 1 } 4 5 6

 

// call ๋ฉ”์„œ๋“œ-2

var obj = {
  a: 1,
  method: function (x, y) {
    console.log(this.a, x, y);
  }
}

obj.method(2, 3);                 // 1 2 3
obj.method.call({ a: 4 }, 5, 6);  // 4 5 6

 

 

๐Ÿฉ apply

call ๋ฉ”์„œ๋“œ์™€ ๊ธฐ๋Šฅ์ ์œผ๋กœ ์™„์ „ํžˆ ๋™์ผํ•˜๋‹ค.

Function.prototype.apply(thisArg[, argsArray])

call ๋ฉ”์„œ๋“œ๋Š” ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ชจ๋“  ์ธ์ž๋“ค์„ ํ˜ธ์ถœํ•  ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ง€์ •ํ•˜๋Š” ๋ฐ˜๋ฉด, apply ๋ฉ”์„œ๋“œ๋Š” ๋‘ ๋ฒˆ์งธ ์ธ์ž๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฐ›์•„ ๊ทธ ๋ฐฐ์—ด์˜ ์š”์†Œ๋“ค์„ ํ˜ธ์ถœํ•  ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ง€์ •ํ•œ๋‹ค๋Š” ์ ์—์„œ๋งŒ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

 

// apply ๋ฉ”์„œ๋“œ

var func = function (a, b, c) {
  console.log(this, a, b, c);
};

func.apply({ x: 1 }, [4, 5, 6]);  // { x: 1 } 4 5 6

var obj = {
  a: 1,
  method: function (x, y) {
    console.log(this.a, x, y);
  }
};
obj.method.apply({ a: 4 }, [5, 6]);  // 4 5 6

 

 

๐Ÿฉ bind

ES5์—์„œ ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ์œผ๋กœ, call๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ์ฆ‰์‹œ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ๋„˜๊ฒจ๋ฐ›์€ this ๋ฐ ์ธ์ˆ˜๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ๋งŒ ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.

Function.prototype.bind(thisArg[, arg1[, arg2[, ...]]])

 

๋‹ค์‹œ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ธ์ˆ˜๋ฅผ ๋„˜๊ธฐ๋ฉด ๊ทธ ์ธ์ˆ˜๋“ค์€ ๊ธฐ์กด bind ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ „๋‹ฌํ–ˆ๋˜ ์ธ์ˆ˜๋“ค์˜ ๋’ค์— ์ด์–ด์„œ ๋“ฑ๋ก๋œ๋‹ค. ์ฆ‰, bind ๋ฉ”์„œ๋“œ๋Š”

  • ํ•จ์ˆ˜์— this๋ฅผ ๋ฏธ๋ฆฌ ์ ์šฉํ•˜๋Š” ๊ฒƒ
  • ๋ถ€๋ถ„ ์ ์šฉ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ

๋‘ ๊ฐ€์ง€ ๋ชฉ์ ์„ ๋ชจ๋‘ ์ง€๋‹Œ๋‹ค.

 

// this ์ง€์ •๊ณผ ๋ถ€๋ถ„ ์ ์šฉ ํ•จ์ˆ˜ ๊ตฌํ˜„

var func = function (a, b, c, d) {
  console.log(this, a, b, c, d);
};
func(1, 2, 3, 4);       // Window{ ... } 1 2 3 4

var bindFunc1 = func.bind({ x: 1 });
bindFunc1(5, 6, 7, 8);  // { x: 1 } 5 6 7 8
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€