Function.prototype.bind()

Function.prototype.bind๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ˜ธ์ถœํ•  ๋•Œ this ํ‚ค์›Œ๋“œ์˜ ๊ฐ’์„ ๊ณ ์ •์‹œํ‚ค๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค.
์ด ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋˜๋Š” this๊ฐ€ ํŠน์ •ํ•œ ๊ฐ์ฒด๋กœ ๊ณ ์ •๋œ๋‹ค.
ํ•จ์ˆ˜ ๋ฉ”์†Œ๋“œ call, apply, bind๊ฐ€ ๊ณตํ†ต์ ์œผ๋กœ ์ฒซ๋ฒˆ์งธ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ this ๊ฐ’์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
function greet() {
    console.log(`Hello, ${this.name}!`);
}

const person = {
    name: 'Alice'
};

greet.call(person); // "Hello, Alice!"
greet.apply(person); // "Hello, Alice!"
  
์œ„ ์ฝ”๋“œ์—์„œ call๊ณผ apply๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ greet ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, this๋Š” person ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌ์ผœ this๊ฐ’์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•ด ์ฃผ์—ˆ๋‹ค. ๋‹จ, bind๋Š” call, apply์™€ ๋‹ฌ๋ฆฌ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค. ์•„๋ž˜๋Š” bind๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ์ œ์ด๋‹ค.
const module = {
  x: 42,
  getX: function() {
    return this.x;
  }
};

const unboundGetX = module.getX;
console.log(unboundGetX()); // undefined
์ฝ”๋“œ์—์„œ module ๊ฐ์ฒด์—๋Š” x๋ผ๋Š” ์†์„ฑ๊ณผ getX๋ผ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋‹ค. unboundGetX๋Š” getX ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”๋ฐ ์ด๋•Œ this๋Š” ํ˜ธ์ถœ ์‹œ์ ์— ๋”ฐ๋ผ ๊ฒฐ์ •๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ unboundGetX()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด this๋Š” ์ „์—ญ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฏ€๋กœ x๋Š” ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰๋˜์–ด undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
์ด๋ฒˆ์—๋Š” bind ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ์ œ๋ฅผ ๋ณด๋„๋ก ํ•˜์ž.
const module = {
  x: 42,
  getX: function() {
    return this.x;
  }
};

const unboundGetX = module.getX;
const boundGetX = unboundGetX.bind(module);
console.log(boundGetX()); // 42
์œ„์—์„œ unboundGetX ํ•จ์ˆ˜๋ฅผ module ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉํ•˜์—ฌ boundGetX๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ด์ œ boundGetX()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด this๋Š” module ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฏ€๋กœ x์˜ ๊ฐ’์ธ 42๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
bind๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜์˜ this๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์–ด์„œ, ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ์—์„œ ํ˜ธ์ถœํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค. ๋˜ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ์ง€์ •ํ•˜์—ฌ ๋ถ€๋ถ„์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.