Languages/Javascript

[Javascript] this ๋ž€?

MOONCO 2022. 7. 7. 21:07

๐Ÿ‘‰ this ๋ž€?

๋ฉ”์„œ๋“œ์—๊ฒŒ, ์ž์‹ ์ด ๊ด€๋ฆฌํ•ด์•ผํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ
// foo1() ๋ฉ”์„œ๋“œ๋Š” cat ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ์ด๋•Œ this๋กœ cat์„ ์ „๋‹ฌํ•œ๋‹ค.
const cat = {
  name: 'meow',
  foo1: function(){
    console.log(this.name);
  }
};

 

this๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

๋ฉ”์„œ๋“œ๋Š”, ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜(property)๋“ค์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ์กด์žฌํ•œ๋‹ค. ( ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ด๋ฏ€๋กœ )

๊ทธ๋Ÿฌ๋ ค๋ฉด, ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ •๋ณด(this)๋ฅผ ์•Œ๊ณ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

 

this์—†์ด, ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด ์ •๋ณด ์ „๋‹ฌํ•˜๊ธฐ

// this๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ ์–ด์ค€ ๊ฒฝ์šฐ
let cat = {
  name: 'meow',
  foo1: function(){
    console.log(cat.name);
  },
}

// cat ๊ฐ์ฒด ๋ณต์‚ฌ
let cat2 = cat

// ๊ธฐ์กด cat ๊ฐ์ฒด ์‚ญ์ œ
cat = null

// cat2 ๊ฐ์ฒด์˜ foo1() ๋ฉ”์„œ๋“œ ์‹คํ–‰
cat2.foo1()
 cat2์˜ ๋ฉ”์„œ๋“œ๋Š”, cat2 ๊ฐ์ฒด์˜ ์š”์†Œ๋“ค์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ ธ์•ผ ํ•œ๋‹ค.
  
 ํ•˜์ง€๋งŒ cat2.foo1() ๋ฉ”์„œ๋“œ๋Š”
cat.foo1() ๋ฉ”์„œ๋“œ๋ฅผ ๋ณต์‚ฌํ•œ ๊ฒƒ์ด๋ฏ€๋กœ,

 cat2๊ฐ€ ์•„๋‹Œ, cat์— ์ ‘๊ทผํ•˜๊ณ  ์žˆ๋‹ค.

์ด๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋ฉ”์†Œ๋“œ์˜ ์—ญํ• ์— ์œ„๋ฐฐ๋˜๋ฏ€๋กœ,

๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๋”๋ผ๋„, ๋ฉ”์„œ๋“œ๊ฐ€ ๊ด€๋ฆฌํ•  ๊ฐ์ฒด๋ฅผ ์ •ํ™•ํžˆ ์•Œ๋ ค์ค„ ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•ด์กŒ๋‹ค.

๊ทธ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ , this๋ผ๊ณ  ์ด๋ฆ„ ๋ถ™์˜€๋‹ค. 

 

๐Ÿ‘‰ JS์—์„œ์˜ this

[ Javascript์—์„œ this๋Š”, ๋‹ค๋ฅธ ์–ธ์–ด์˜ this์™€ ๋‹ค๋ฅด๋‹ค. ]

1. javascript ๋Ÿฐํƒ€์ž„(์‹คํ–‰)์‹œ, ๋ฉ”์„œ๋“œ๊ฐ€ ์œ„์น˜ํ•œ ๊ณณ์—์„œ ๊ฒฐ์ •
  ( ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์˜ ๋œ ๊ณณ๊ณผ๋Š” ์ƒ๊ด€์—†๋‹ค )

2. ํ•จ์ˆ˜๋ฅผ ๊ฐ์‹ธ๋Š” ๊ฐ์ฒด๊ฐ€ ๋ณด์ด์ง€ ์•Š์œผ๋ฉด, ์ „์—ญ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ
  - ๋ธŒ๋ผ์šฐ์ € ๋Ÿฐํƒ€์ž„ : window ๊ฐ์ฒด
  - Node.js ๋Ÿฐํƒ€์ž„ : global ๊ฐ์ฒด
  ( ์ตœ๊ทผ ์ „์—ญ๊ฐ์ฒด์˜ ์ด๋ฆ„์ด globalThis๋กœ ๋ณ‘ํ•ฉ๋˜์–ด ๊ฐ€๊ณ  ์žˆ๋‹ค. )
// ํ•จ์ˆ˜์ •์˜์‹œ, this๋ฅผ ์ •ํ•˜์ง€ ์•Š์Œ
function getUser(){
  return {
    name: "John",
    ref: alert(this.name)
  }
}


// ํ•จ์ˆ˜ํ˜ธ์ถœ๋จ => javascript ๋Ÿฐํƒ€์ž„ => this๊ฐ€ ๊ฒฐ์ •๋จ
// getUser()๋Š” ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ๋์œผ๋ฏ€๋กœ, this๋Š” ์ „์—ญ๊ฐ์ฒด๋กœ ์ „ํ•ด์ง„๋‹ค. ( window )
let user = getUser()


console.log(user.ref())
// window.name์€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, undefined ์ถœ๋ ฅ

 

๐Ÿ‘‰ this์™€ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜

[ ํ™”์‚ดํ‘œํ•จ์ˆ˜๋Š” ๊ณ ์œ ํ•œ this๊ฐ€ ์—†์Œ ]

ํ™”์‚ดํ‘œํ•จ์ˆ˜ ์†์—์„œ this๋ฅผ ์ฐธ์กฐํ•˜๋ฉด, ํ‰๋ฒ”ํ•œ ์™ธ๋ถ€ ํ•จ์ˆ˜์—์„œ this๋ฅผ ๋นŒ๋ ค์˜จ๋‹ค.
let user = {
  firstName: "๋ณด๋ผ",
  sayHi() {
    // arrow() ํ•จ์ˆ˜ ๋ฐ–์˜ sayHi์˜ this๋ฅผ ๋นŒ๋ ค์˜จ๋‹ค
    let arrow = () => alert(this.firstName);
    arrow();
  }
};

user.sayHi()
// ๋ณด๋ผ ์ถœ๋ ฅ

 

๐Ÿ‘‰ ๋ฐ”์ธ๋”ฉ์ด๋ž€?

๊ธฐ์กด์˜ this๋ฅผ ๋ฌด์‹œํ•˜๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๊ฐ์ฒด๋กœ this๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ
const cat = {
  name: 'meow',
  foo1: function(){
    // this : cat
    console.log(this.name);
  }
};

const dog = {
  name: 'wak',
  foo1: function(){
    // this : cat
    console.log(this.name);
  }
};

// cat๊ฐ์ฒด์˜ foo1()๋ฉ”์„œ๋“œ๊ฐ€ ๊ด€๋ฆฌํ•ด์•ผํ•  ๊ฐ์ฒด๋ฅผ dog๋กœ ๋ฐ”๊ฟ”์„œ ์‹คํ–‰ํ•œ๋‹ค.
cat.foo1.bind(dog)

/*
  cat๊ฐ์ฒด์˜ foo1()๋ฉ”์„œ๋“œ ์‹คํ–‰๊ฒฐ๊ณผ : wak
*/

 

๋ฐ”์ธ๋”ฉ์ด ํ•„์š”ํ•œ ์ด์œ 

setTimeout์— ๋ฐ์„œ๋“œ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ์ฒ˜๋Ÿผ,
๊ฐ์ฒด ๋ฉ”์„œ๋“œ๋ฅผ ์ฝœ๋ฐฑ์œผ๋กœ ์ „๋‹ฌํ• ๋•Œ,
this๊ฐ€ ์‚ฌ๋ผ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ

 

๋ฐ˜์‘ํ˜•