πŸ“Ί Front End/- HTML,css,Javascript

[Javascript-Core] λ©”μ„œλ“œ λ‚΄λΆ€μ—μ„œμ˜ this 그리고 ν•¨μˆ˜μ™€ λ©”μ„œλ“œμ˜ 차이점 (λΆ€μ œ) :: JSμ—μ„œ λ§ν•˜λŠ” This에 μ •ν™•ν•œ μ˜λ―Έμ™€ λ‹€μ–‘ν•œ μƒν™©μ—μ„œμ˜ this(2)

Wonit 2020. 7. 28. 13:41

였늘 μ•Œμ•„λ³Ό 것은 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된 객체이닀.


ν•¨μˆ˜μ™€ λ©”μ„œλ“œμ— λŒ€ν•œ μ„€λͺ…을 μΆ”κ°€ν•˜λŠλΌ 이야기가 많이 κΈΈμ–΄μ‘Œμ§€λ§Œ μ°¨λΆ„νžˆ 읽으면 λͺ¨λ‘ 이해가 될 μ •λ„μ˜ λΆ„λŸ‰μ΄λΌκ³  μƒκ°ν•œλ‹€.
이해가 μ•ˆλœλ‹€κ³ , μ„€λͺ…이 λ„ˆλ¬΄ μ–΄λ ΅λ‹€κ³  λ„ˆλ¬΄ μ–΄λ €μ›Œν•˜μ§€ 말고 보고 또 보고 λ‹€λ₯Έ 일 ν•˜κ³  λ‹€μ‹œ 보고λ₯Ό λ°˜λ³΅ν•˜λ©΄ μ–΄λŠ μˆœκ°„ 유레카 ν•˜λŠ” μ‹œμ μ΄ 올 것이닀. λ‚˜ λ˜ν•œ κ·Έλž˜μ™”κΈ° λ•Œλ¬Έμ— λ‚΄κ°€ 제일 잘 μ•Œκ³  μžˆλ‹€. λͺ¨λ‘ ν¬κΈ°ν•˜μ§€ 말고 ν™”μ΄νŒ…!!