[JS] ๐Ÿงƒthis ์ •๋ฆฌ (ft. bind, call, apply)

TATAยท2023๋…„ 2์›” 18์ผ
0

JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
25/25

๐Ÿ˜ฎ this: "๋ˆ„๊ฐ€ ๋‚˜๋ฅผ ๋ถ€๋ฅธ ๊ฑฐ์•ผ?"

์„ ์–ธ์ด ์•„๋‹Œ, ํ˜ธ์ถœ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” this๋ฅผ ์•Œ์•„๋ณด์ž๐Ÿ’จ

๐Ÿงƒ ๋‹จ๋… this

๊ทธ๋ƒฅ this๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” global object๋ฅผ ๊ฐ€๋ฅดํ‚จ๋‹ค.

console.log(this); // window
// strict mode => window

๐Ÿงƒ ํ•จ์ˆ˜ ์•ˆ this

ํ•จ์ˆ˜ ์•ˆ this๋Š” ํ•จ์ˆ˜์˜ ์ฃผ์ธ์ธ window๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค.

function a() {
  return this;
}

console.log(a()); // window
/* strict mode => undefined
   (ํ•จ์ˆ˜ ๋‚ด this์˜ ๋””ํดํŠธ ๋ฐ”์ธ๋”ฉ์ด ์—†๊ธฐ ๋•Œ๋ฌธ) */

๐Ÿงƒ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ ์•ˆ this

๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ this๋Š” ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€ ์ฝ”๋“œ์—์„œ
์‚ฌ์šฉ๋œ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด๋กœ ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค.

โ–ท ์˜ˆ์‹œ 1

const objList = {
  b: function () {
      return this;
    }
}

console.log(objList.b()); // objList

โ–ท ์˜ˆ์‹œ 2

const user = {
  firstName: "TATA",
  lastName: "V",
  fullName: function () {
    return this.firstName + "-" + this.lastName;
  },
};

console.log(user.fullName()); // TATA-V

๐Ÿงƒ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์•ˆ this

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ this๋Š” ์ด๋ฒคํŠธ ํƒ€๊ฒŸ์ธ HTML ์š”์†Œ๋ฅผ ๊ฐ€๋ฅดํ‚จ๋‹ค.

const $btn = document.querySelector("#btn")

$btn.addEventListener("click", function () {
  console.log(this); // #btn
})

๐Ÿงƒ ํด๋ž˜์Šค ์•ˆ this

ํด๋ž˜์Šค ๋‚ด์—์„œ this๋Š” ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฅดํ‚จ๋‹ค.

class User {
  constructor(name) {
    this.name = name;
  }
}

var user1 = new User("TATA");
var user2 = new User("CHIMMY");

console.log(user1.name); // TATA
console.log(user2.name); // CHIMMY

๐Ÿงƒ ๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ์„ ํ•œ this

bind, call, apply๊ณผ ๊ฐ™์€ ๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ์„
์‚ฌ์šฉํ–ˆ์„ ๋•Œ์—๋Š” ์ธ์ž๋กœ ์ „๋‹ฌ๋œ ๊ฐ์ฒด๋กœ ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.

function user() {
  return this.name;
}

const objList = { name: "TATA" };
console.log(user.bind(objList)()); // TATA
console.log(user.call(objList)); // TATA
console.log(user.apply(objList)); // TATA

๐Ÿงƒ bind - this

bind๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ , ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

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

function data(a, b, c) {
  console.log(this.name);
  console.log(this.squad);
  console.log(a + b + c);
}

const user = {
  name: "TATA",
  squad: "BT21",
};

// ๋ฐ˜ํ™˜๋œ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด์•ผ ์›๋ณธ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
data.bind(user, 1, 2, 3)();
// TATA
// BT21
// 6

๊ทธ๋ž˜์„œ ์ฒซ ๋ฒˆ์งธ ์ธ์ž์— null์„ ๋„ฃ์–ด ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

function data(a, b, c) {
  console.log("์ด๊ฒƒ์ด ๋ฐ”๋กœ");
  console.log("bind");
  console.log(a + b + c);
}

data.bind(null, 1, 2, 3)();
// ์ด๊ฒƒ์ด ๋ฐ”๋กœ
// bind
// 6

๐Ÿงƒ call - this

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

function data(a, b, c) {
  console.log(this.name);
  console.log(this.squad);
  console.log(a + b + c);
}

const user = {
  name: "TATA",
  squad: "BT21",
};

data.call(user, 1, 2, 3);
// TATA
// BT21
// 6

๐Ÿงƒ apply - this

apply๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ณ ,
์ฒซ ๋ฒˆ์งธ ์ธ์ž ๊ฐ’์€ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋˜๋Š” this์— ๋ฐ”์ธ๋”ฉ๋˜๊ณ ,
๋‘ ๋ฒˆ์งธ ์ธ์ž ๊ฐ’์ธ ๋ฐฐ์—ด์€ ์ž์‹ ์„ ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

function data(a, b, c) {
  console.log(this.name);
  console.log(this.squad);
  console.log(a + b + c);
}

const user = {
  name: "TATA",
  squad: "BT21",
};

const arrNum = [1, 2, 3];

data.apply(user, arrNum);
// TATA
// BT21
// 6

// But, ์š”์ฆ˜์—” apply๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์Šคํ”„๋ ˆ๋“œ์™€ call์„ ์‚ฌ์šฉํ•œ๋‹ค.
data.call(user, ...arrNum);
// TATA
// BT21
// 6

๐Ÿงƒ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์•ˆ this

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์™ธ๋ถ€์˜ this๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

โ–ท setTimeout ์ผ๋ฐ˜ ํ•จ์ˆ˜

const user = {
  firstName: "TATA",
  lastName: "V",
  fullName: function () {
    setTimeout(function () {
      console.log(this); // window
      console.log(this.firstName + "-" + this.lastName);
    }, 3000);
  },
};

user.fullName(); // undefined

โ–ท setTimeout ํ™”์‚ดํ‘œ ํ•จ์ˆ˜

const user = {
  firstName: "TATA",
  lastName: "V",
  fullName: function () {
    setTimeout(() => {
      console.log(this.firstName + "-" + this.lastName);
    }, 3000);
  },
};

user.fullName(); // TATA-V



๐Ÿ‘‰ this ์ •๋ฆฌ ์ž˜ ๋œ ๋ธ”๋กœ๊ทธ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ

profile
๐Ÿพ

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