๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ“บ Front End/- HTML,css,Javascript

[Javascript-Core] ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ์˜ this ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜์™€ ๋ฉ”์„œ๋“œ์˜ ์ฐจ์ด์  (๋ถ€์ œ) :: JS์—์„œ ๋งํ•˜๋Š” This์— ์ •ํ™•ํ•œ ์˜๋ฏธ์™€ ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์—์„œ์˜ this(2)

by Wonit 2020. 7. 28.

์˜ค๋Š˜ ์•Œ์•„๋ณผ ๊ฒƒ์€ this์ด๋‹ค.


๋‚˜๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด์ธ java๋ฅผ ๋จผ์ € ๋ฐฐ์› ๊ธฐ ๋•Œ๋ฌธ์— js์—์„œ ๋งํ•˜๋Š” this๋ฅผ ๋‹จ์ง€ class ๋‚ด๋ถ€์˜ ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์—ญํ• ๋กœ์จ ์ดํ•ด๋ฅผ ํ–ˆ์—ˆ์ง€๋งŒ, js์—์„œ ๋งํ•˜๋Š” this๋Š” ํ›จ์”ฌ ๋‹ค์–‘ํ•˜๊ณ  ์‹ฌ์˜คํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.


์˜ค๋Š˜ ๊ทธ ์‹ฌ์˜คํ•œ ๊ธฐ๋Šฅ๋“ค์— ๋Œ€ํ•ด์„œ ์งš์–ด๋ณด์ž.

ํ•ด๋‹น ๊ธ€์€ 4๋ถ€์ž‘์œผ๋กœ ๋‚˜๋‰˜์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. this์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์™„๋ฒฝํžˆ ํŒŒ์•…ํ•˜๊ณ ์‹ถ๋‹ค๋ฉด ํ•œ ๋ฒˆ ๋ด๋ณด๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
  1. ์ „์—ญ ๊ณต๊ฐ„์—์„œ์˜ this
  2. ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ์˜ this
  3. ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this
  4. ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ์˜ this

What is this

w3cschool

์ตœ๋Œ€์˜ docs๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” w3c์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด this์˜ ๊ธฐ๋Šฅ์„ ๋ถ„๋ฅ˜ํ•œ๋‹ค.

 

  • ๋ฉ”์„œ๋“œ์—์„œ this๋Š” ๊ทธ์˜ ์ฃผ์ธ ๊ฐ์ฒด(Owner Obj)๋ฅผ ๋œปํ•œ๋‹ค.
  • this๊ฐ€ ๋‹จ๋…์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉด ๊ทธ๊ฒƒ์€ global ๊ฐ์ฒด๋ฅผ ๋œปํ•œ๋‹ค.
  • ํ•จ์ˆ˜์—์„œ this๋Š” global ๊ฐ์ฒด๋ฅผ ๋œปํ•œ๋‹ค.
  • strict mode๊ฐ€ ์ ์šฉ๋œ ํ•จ์ˆ˜์—์„œ this๋Š” undefined์ด๋‹ค.
  • ์ด๋ฒคํŠธ์—์„œ this๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›๋Š” element๋ฅผ ๋œปํ•œ๋‹ค.
  • call()๊ณผ apply() ๊ฐ™์€ ๋ฉ”์„œ๋“œ์—์„œ this๋Š” any object๋ฅผ ๋œปํ•œ๋‹ค.

๊ฐ๊ฐ์˜ ์˜ˆ๋ฅผ ํ†ตํ•ด์„œ ์กฐ๊ธˆ ์‰ฝ๊ฒŒ ์ดํ•ดํ•ด๋ณด์ž.

 

๋ชจ๋“  ์›๋ฆฌ๋ฅผ ํŒŒ์•…ํ•˜๋Š”๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•˜๋‹ค.

 

๋‹จ์ˆœํžˆ ์•”๊ธฐ๋ฅผ ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋‹น์žฅ์€ ํšจ๊ณผ์ ์ผ์ง€ ๋ชจ๋ฅด๊ฒ ์œผ๋‚˜ ์–ธ์ œ ์–ด๋–ค ์–ธ์–ด๊ฐ€ ์–ด๋–ป๊ฒŒ ์‚ฌ๋ผ์ง€๊ณ  ๋“ฑ์žฅํ• ์ง€ ๋ชจ๋ฅด๋Š” ํ˜„์žฌ์—๋Š” ์–ธ์–ด์˜ ์‚ฌ์šฉ๋ฒ•๋ณด๋‹จ ์ปดํ“จํŒ…์  ์‚ฌ๊ณ ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค.


๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ์˜ this

๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ์˜ this๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„  ๋จผ์ € ํ•จ์ˆ˜์™€ ๋ฉ”์„œ๋“œ์˜ ์ฐจ์ด์— ๋Œ€ํ•ด์„œ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

 

ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”

  1. ํ•จ์ˆ˜๋กœ์จ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ
  2. ๋ฉ”์„œ๋“œ๋กœ์จ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ

์ด๋ ‡๊ฒŒ ๋‘ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค.

 

์•„๋‹ˆ ์ด๊ฒŒ ๋ฌด์Šจ์ด์•ผ๊ธฐ๋ƒ?๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‚ฌ์‹ค ๋ฉ”์„œ๋“œ๋ผ๋Š” ๊ฒƒ์ด ๊ฐ์ฒด ๋‚ด๋ถ€์—์„œ ๋™์ž‘ํ•˜๋Š” ํ•จ์ˆ˜๋ผ๋Š” ์‚ฌ์‹ค์„ ๊ธฐ์–ตํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด์•ผ๊ธฐ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.

 

๋‚˜์ค‘์— ๋ฐฐ์šฐ๊ฒŒ๋  ๊ฒƒ์ด์ง€๋งŒ ecmascript6์—์„œ ์†Œ๊ฐœ๋œ class ๋‚ด๋ถ€์— ๋™์ž‘ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

class MyReact extends Component {
     render(){
         return(); 
    }
}

 

๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ •์˜ํ•˜๋Š” ํด๋ž˜์Šค์ธ๋ฐ, ์—ฌ๊ธฐ์„œ render() ๋ฉ”์„œ๋“œ๋Š” ์‚ฌ์‹ค function render()์˜ ํ˜•ํƒœ์ง€๋งŒ ํด๋ž˜์Šค(๊ฐ์ฒด) ๋‚ด๋ถ€์— ์œ„์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž„์˜์ ์œผ๋กœ function ํ‚ค์›Œ๋“œ๋ฅผ ์ œ์™ธํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

 

ํ•จ์ˆ˜์™€ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด์„œ ์ •ํ™•ํ•œ ๊ตฌ๋ถ„์„ ํ•ด๋ณด์ž.

๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ์˜ this๋ฅผ ์•Œ์•„๋ณด๊ธฐ ์ „์— ์ด๊ฒƒ ๋ถ€ํ„ฐ ํ™•์‹คํžˆ ํ•˜์ž.

 

ํ•จ์ˆ˜์™€ ๋ฉ”์„œ๋“œ์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ ๋…๋ฆฝ์„ฑ์ด๋‹ค.


ํ•จ์ˆ˜๋Š” ๊ทธ ์ž์ฒด๋กœ๋„ ํ˜ผ์ž ์‹คํ–‰๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฉ”์„œ๋“œ๋Š” ์ž์‹ ์„ ํ˜ธ์ถœํ•œ ๋Œ€์ƒ ๊ฐ์ฒด์— ๊ด€ํ•œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

์œ„์™€ ๊ฐ™์€ ๋ฆฌ์•กํŠธ ์ฝ”๋“œ๋„ ์‚ฌ์‹ค ๋ฆฌ์•กํŠธ์˜ ์ฝ”์–ด๋ฅผ ๋ถ„์„ํ•ด๋ณธ๋‹ค๋ฉด MyReact.render()๋ฅผ ํ˜ธ์ถœํ•จ์œผ๋กœ์จ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

์ข€ ๋” ์ •ํ™•ํžˆ ์ด์•ผ๊ธฐ ํ•˜์ž๋ฉด

class HelloComponent extends Component {
     render(){
         return <div> Hello </div>; 
    }
}

 

์—์„œ ๋งํ•˜๋Š” render()(Hello๋ฅผ ์ถœ๋ ฅ)์™€

 

class WorldComponent extends Component {
     render(){
         return <div> World </div>; 
    }
}

console.log(HelloComponent.render());
console.log(WorldComponent.render());

์—์„œ ๋งํ•˜๋Š” render()(World๋ฅผ ์ถœ๋ ฅ)์™€๋Š” ์„œ๋กœ ๋‹ค๋ฅธ render์ด๊ธฐ ๋•Œ๋ฌธ์— ์ •ํ™•ํ•œ ํด๋ž˜์Šค(๊ฐ์ฒด)์˜ ์ด๋ฆ„์— ๊ด€ํ•œ .์—ฐ์‚ฐ์œผ๋กœ ํ˜ธ์ถœ์„ ํ•ด์•ผ ํ•œ๋‹ค.

 

๊ทธ์— ๋ฐ˜ํ•ด ํ•จ์ˆ˜๋Š”

function hello() {
     return "hello"; 
}

function world() {
      return "world";
}

console.log(hello());
console.log(world());

์ฒ˜๋Ÿผ ๋…๋ฆฝ์ ์œผ๋กœ ํ•จ์ˆ˜๋ช…์œผ๋กœ๋„ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ์˜คํ•ด

 

์‚ฌ๋žŒ๋“ค์ด ๋งŽ์ด ํ•˜๊ณ  ์žˆ๋Š” ์˜คํ•ด๊ฐ€ ๊ฐ์ฒด ๋‚ด๋ถ€์— ์ •์˜๋œ ํ•จ์ˆ˜๋Š” ๋ชจ๋‘ ๋ฉ”์„œ๋“œ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.


ํ•˜์ง€๋งŒ ๊ทธ๊ฑด ํ‹€๋ฆฐ ์ด์•ผ๊ธฐ์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๋งž๋Š” ์ด์•ผ๊ธฐ์ผ ์ˆ˜๋„ ์žˆ๋‹ค.

 

ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜๋กœ์จ ํ˜ธ์ถœ๋˜๋ฉด ํ•จ์ˆ˜์ด๊ณ , ๋ฉ”์„œ๋“œ๋กœ์„œ ํ˜ธ์ถœ๋˜๋ฉด ๋ฉ”์„œ๋“œ์ด๋‹ค.


๋ง์ด ์–ด๋ ต์ง€ ๊ฐ„๋‹จํ•˜๋‹ค.

 

์—ฌ๊ธฐ์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋ฉด?

class HelloComponent extends Component {

      sayHello() {
         return "Hello" 
    }
     render(){
         return <div> {sayHello()} </div>; // ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ํ•จ์ˆ˜๋กœ์จ ํ˜ธ์ถœํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜
    }
}

console.log(HelloComponent.sayHello()) // . ์—ฐ์‚ฐ์ž๋กœ ํ˜ธ์ถœํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์„œ๋“œ

HelloComponent ๋Š” ๊ฐ์ฒด(ํด๋ž˜์Šค)์ธ๋ฐ, ์—ฌ๊ธฐ์„œ render()์™€ sayHello()๋Š” ์‚ฌ์‹ค ํ•จ์ˆ˜์ด๋‹ค.

 

์ด์ œ ํ•จ์ˆ˜์™€ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ์ •ํ™•ํ•œ ์ฐจ์ด๋ฅผ ์•Œ๊ฒŒ ๋˜์—ˆ์œผ๋ฏ€๋กœ ๋ณธ๋ก ์ธ this์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ์˜ this

this์—๋Š” ํ˜ธ์ถœํ•œ ์ฃผ์ฒด์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด๋‹ค.


์ฆ‰ . ์—ฐ์‚ฐ์ž ๋ฐ”๋กœ ์•ž์— ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ this๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

class HelloComponent extends Component {

     render(){
         return <div> "hello world" </div>; 
    }
}

console.log(HelloComponent.render(), this);

์ด๋Ÿฌํ•œ ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•  ๋•Œ ๊ฒฐ๊ณผ๋Š” ๋ฐ”๋กœ ํ˜„์žฌ ์—ฐ๊ด€๋œ ๊ฐ์ฒด HelloComponent๊ฐ€ thisBinding๋œ ๊ฐ์ฒด์ด๋‹ค.


ํ•จ์ˆ˜์™€ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์ถ”๊ฐ€ํ•˜๋Š๋ผ ์ด์•ผ๊ธฐ๊ฐ€ ๋งŽ์ด ๊ธธ์–ด์กŒ์ง€๋งŒ ์ฐจ๋ถ„ํžˆ ์ฝ์œผ๋ฉด ๋ชจ๋‘ ์ดํ•ด๊ฐ€ ๋  ์ •๋„์˜ ๋ถ„๋Ÿ‰์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.
์ดํ•ด๊ฐ€ ์•ˆ๋œ๋‹ค๊ณ , ์„ค๋ช…์ด ๋„ˆ๋ฌด ์–ด๋ ต๋‹ค๊ณ  ๋„ˆ๋ฌด ์–ด๋ ค์›Œํ•˜์ง€ ๋ง๊ณ  ๋ณด๊ณ  ๋˜ ๋ณด๊ณ  ๋‹ค๋ฅธ ์ผ ํ•˜๊ณ  ๋‹ค์‹œ ๋ณด๊ณ ๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉด ์–ด๋Š ์ˆœ๊ฐ„ ์œ ๋ ˆ์นด ํ•˜๋Š” ์‹œ์ ์ด ์˜ฌ ๊ฒƒ์ด๋‹ค. ๋‚˜ ๋˜ํ•œ ๊ทธ๋ž˜์™”๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๊ฐ€ ์ œ์ผ ์ž˜ ์•Œ๊ณ  ์žˆ๋‹ค. ๋ชจ๋‘ ํฌ๊ธฐํ•˜์ง€ ๋ง๊ณ  ํ™”์ดํŒ…!!

๋Œ“๊ธ€