๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“’ JavaScript

[JS Tam9์ƒํ™œ] #8 ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ this ๋ž€?

by Tamii 2021. 8. 11.
๋ฐ˜์‘ํ˜•

๐Ÿ“’22 this

this

  • ์ž์‹ ์ด ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ์‹๋ณ„์ž

  • this๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค์˜ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

  • JS์—”์ง„์— ์˜ํ•ด ์•”๋ฌต์ ์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.

    funciont Foo = {
      this.a = a;
    
      Foo.prototype.getA = funciton()    {
          return a*a
      }
    }
    Foo = new foo(3)

    Foo๋Š” foo๋ฅผ ์ฐธ์กฐํ•  ์‹๋ณ„์ž this๊ฐ€ ํ•„์š”

this ๋ฐ”์ธ๋”ฉ

this๋ฐ”์ธ๋”ฉ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์— ์˜ํ•ด ๋™์ ์œผ๋กœ ๊ฒฐ์ •
๋ฐ”์ธ๋”ฉ: ์‹๋ณ„์ž์™€ ๊ฐ’์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ณผ์ •
(๋ณ€์ˆ˜์„ ์–ธ: a=10 a์™€ 10์„ ์ €์žฅํ•  ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๊ฒƒ)

  • JAVA,C++๊ณผ ๋‹ค๋ฅด๊ฒŒ JS์˜ this๋Š” ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ๊ฒฐ์ •๋œ๋‹ค
  • strict mode์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง
funciton foo(){
    console.log(this)
    //์ผ๋ฐ˜๋ชจ๋“œ : window
    //strict mode: undefined
}

ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ๋”ฐ๋ฅธ this ๋ฐ”์ธ๋”ฉ

const obj = {foo}
const bar = { a: 10}

// 1) ์ผ๋ฐ˜ํ•จ์ˆ˜ ํ˜ธ์ถœ: window : ์ „์—ญ ๊ฐ์ฒด
foo()

// 2) ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ: obj : ํ˜ธ์ถœํ•œ ๊ฐ์ฒด
obj.foo()

//3) ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ํ˜ธ์ถœ: foo{} : ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค
new foo()

//4) Function.prototype.apply call bind
foo.call(bar) //bar
foo.apply(bar) //ba
foo.bind(bar)() //bar

์ผ๋ฐ˜ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€์˜ this์—๋Š” ์ „์—ญ๊ฐ์ฒด๊ฐ€ ๋ฐ”์ธ๋”ฉ ๋˜๋Š”๋ฐ,
๋‚ด๋ถ€ ์ค‘์ฒฉํ•จ์ˆ˜,์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” this๊ฐ€ ์ผ๋ฐ˜ํ•จ์ˆ˜์™€ ๋‹ค๋ฅด๋ฉด ์•ˆ๋˜๊ธฐ๋•Œ๋ฌธ์— ๋ฐ”์ธ๋”ฉ์„ ํ•ด์ค€๋‹ค.
๋ฉ”์„œ๋“œ์˜ this์™€ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์˜ ์ค‘์ฒฉ,์ฝœ๋ฐฑํ•จ์ˆ˜์˜ this๊ฐ€ ๋ถˆ์ผ์น˜ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

setTimeout({}.bind(this),100)
setTimeout(()=>console.log(this.value),100) //ํ™”์‚ดํ‘œํ•จ์ˆ˜ ๋‚ด๋ถ€ this = ์ƒ์œ„ scope this

๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด์— ํฌํ•จ๋œ ๊ฒƒ์ด ์•„๋‹Œ ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌํ•˜๋Š” ๋ณ„๋„์˜ ๊ฐ์ฒด

call,apply

์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฐ์ฒด๋ฅผ this๋กœ ๋ฐ”์ธ๋”ฉ ํ•˜๋ฉฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ

bind

this๋กœ ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

bind์™€ call,apply๋Š” ์–ด๋–ค ์ ์ด ๋‹ค๋ฅธ๊ฐ€?

3๊ฐ€์ง€ ๋‹ค this๋กœ ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๊ณตํ†ต์ ์ด ์ž‡์ง€๋งŒ
call๊ณผ bind๋Š” ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋ฉฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€๋งŒ
bind๋Š” this๋กœ ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ธฐ๋Šฅ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.
ํŠนํžˆ ๋ฉ”์„œ๋“œ์˜ this์™€ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์˜ ์ค‘์ฒฉ,์ฝœ๋ฐฑํ•จ์ˆ˜์˜ this๊ฐ€ ๋ถˆ์ผ์น˜ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

this๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€์š”? [โ“์งˆ๋ฌธ]

์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด์™€ ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฐธ์กฐ๋ณ€์ˆ˜๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

this๊ฐ€ ํ•„์š”ํ•œ ์ด์œ  [โ“์งˆ๋ฌธ]

๋ฉ”์„œ๋“œ๋Š” ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š”๋ฐ ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š”
์ž์‹์ด ์†ํ•œ ๊ฐ์ฒด์™€ ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฐธ์กฐ๋ณ€์ˆ˜์ธ this๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ ‰์‹œ์ปฌ์Šค์ฝ”ํ”„์™€ this ๋ฐ”์ธ๋”ฉ์€ ๊ฒฐ์ • ์‹œ๊ธฐ๊ฐ€ ๋‹ค๋ฅด๋‹ค

๋ ‰์‹œ์ปฌ์Šค์ฝ”ํ”„๋Š” ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ํ›„ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ์‹œ์ ์— ์Šค์ฝ”ํ”„๊ฐ€ ๊ฒฐ์ •๋˜์ง€๋งŒ,
this๋ฐ”์ธ๋”ฉ์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๊ฒฐ์ •์ด ๋ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€