call, apply, bind

Yu Sang Minยท2025๋…„ 2์›” 20์ผ
0

JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
42/48
post-thumbnail

๐Ÿ”” call, apply, bind: ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹๊ณผ ๊ด€๊ณ„ ์—†์ด this๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ call

const mike = {
    name: โ€˜Mikeโ€™
}

const tom = {
    name: โ€˜Tomโ€™
}

function showThisName () {
    console.log(this.name);
}

showThisName(); // undefined

showThisName.call(mike); // โ€˜Mikeโ€™
showThisName.call(tom); // โ€˜Tomโ€™
  • ์ตœ์ดˆ showThisName() ์„ ํ˜ธ์ถœํ•˜๋ฉด undefined๋ฅผ ๋ฐ˜ํ™˜.
  • ํ•จ์ˆ˜์— this๋ฅผ ์ง€์ •ํ•ด์ค˜์•ผ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ด.
  • call()์€ this๋กœ ์ง€์ •๋  ๊ฐ์ฒด๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๋Š” ํ•จ์ˆ˜.
// this๊ฐ€ ๋ฐ”๋ผ๋ณด๋Š” ๊ฐ์ฒด๋Š” ์œ„ ์ฝ”๋“œ์˜ mike ๊ฐ์ฒด ์ฐธ์กฐ

function update(birth, job) {
   this.birthday = birth;
   this.job = job;
}

update.call(mike, 1989, โ€˜Enginnerโ€™); // { name: โ€˜Mikeโ€™, birthday: 1989, job: โ€˜Enginnerโ€™ } 
  • call()์˜ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” this๊ฐ€ ๋  ๊ฐ์ฒด์ด๋‹ค.
  • ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์‹ค์ œ ๋™์ž‘ํ•˜๋Š” ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์ด๋‹ค.
  • ์œ„ ์˜ˆ์‹œ์—์„œ๋Š” 1989๊ฐ€ birth๋กœ, Enginner๊ฐ€ job์œผ๋กœ

๐Ÿ“Œ apply

// ์œ„ ์ฝ”๋“œ์˜ mike ๊ฐ์ฒด์™€ update ํ•จ์ˆ˜ ์ฐธ์กฐ

update.apply(mike, [ 1989, โ€˜Enginnerโ€™ ]); // { name: โ€˜Mikeโ€™, birthday: 1989, job: โ€˜Enginnerโ€™ }
  • apply()๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ ๋ฐฐ์—ด์˜ ํ˜•ํƒœ๋กœ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌ.
  • ๋ฐฐ์—ด์š”์†Œ๋ฅผ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.
const nums = [2, 5, 1, 45, 13];

const numMin = Math.min(nums); // NaN
const numMax = Math.max(nums); // NaN
  • nums๊ฐ€ ๋ฐฐ์—ด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž๋ฃŒํ˜•์ด ๋งž์ง€์•Š์•„ NaN์ด ๋ฐ˜ํ™˜.
  • ์ด๋ฅผ call()๋กœ ์ „๋‹ฌ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ „๊ฐœ ๊ตฌ๋ฌธ ์‚ฌ์šฉ
  • ์ „๊ฐœ ๊ตฌ๋ฌธ์€ ์ „๋‹ฌํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ •ํ•ด์ง€์ง€ ์•Š์€ ์ƒํ™ฉ์— ์‚ฌ์šฉ.
// ์ „๊ฐœ ๊ตฌ๋ฌธ์„ ํ†ตํ•ด ๊ฐ’์„ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๊ธฐ
const nums = [2, 5, 1, 45, 13];

const numMin = Math.min(โ€ฆnums); // 1
const numMax = Math.max(โ€ฆnums); // 45
  • ์ „๊ฐœ ๊ตฌ๋ฌธ์œผ๋กœ ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ํ•จ์ˆ˜์— ์ „๋‹ฌ ํ•˜์˜€๊ณ  ๊ฐ ๋ณ€์ˆ˜์— ํ• ๋‹น
// apply ํ•จ์ˆ˜ ์‚ฌ์šฉํ•˜๊ธฐ

const nums = [2, 5, 1, 45, 13];

const numMin = Math.min.apply(null, nums); // 1
const numMax = Math.max.apply(null, nums); // 45
  • apply()๋Š” ๋ฐฐ์—ด์š”์†Œ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•œ๋‹ค.
  • null์ด ๋“ค์–ด๊ฐ€๋Š” ์ด์œ ๋Š” Math๋ฅผ this๋กœ ์ „๋‹ฌํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • call(),apply() ๋ชจ๋‘ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” this๋ฅผ ์ง€์ •ํ•ด์ฃผ๋Š” ์—ญํ•  ์ด๋‹ค.(์œ„์—์„œ ์•Œ์•„๋ณด์•˜๋‹ค)

๐Ÿ“Œ bind

const user = {
    name: โ€˜Janeโ€™,
    showName: function () {
        console.log(this.name);
    }
}

user.showName(); // Jane

const fn = user.showName;
fn(); // undefined
  • ์ด ๊ฒฝ์šฐ fn์— user.showName์„ ํ• ๋‹นํ•˜๋ฉด์„œ this๋ฅผ ์žƒ์–ด๋ฒ„๋ฆผ.
  • ์ด ๋•Œ bind()๋กœ ํ•จ์ˆ˜์˜ this ๊ฐ’์„ user ๊ฐ์ฒด๋ฅผ ์˜๊ตฌํžˆ ๋ฐ”๋ผ๋ณด๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

const user = {
    name: โ€˜Janeโ€™,
    showName: function () {
        console.log(this.name);
    }
}

let fn = user.showName();
let boundFn = fn.bind(user);
boundFn(); // Jane
profile
ํ’€์Šคํƒ ๊ฐœ๋ฐœ์ž ์ง€๋ง์ƒ (React, Node.js, AWS, Git, Github, Github Action, Docker)

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด