개발공작소
article thumbnail
728x90
반응형

javascript를 사용해서 개발을 하다보면 this라는 키워드를 정말 많이 사용한다.

그래서 오늘 정리를 한번 해보려고 한다. 아마 글이 많이 길어질 듯 한데..

 

this란??

============================================================================

  • this란 ‘이것’ 이란 뜻이다.
  • this란 JavaScript 예약어다.
  • this는 자신이 속한 객체 또는 자신이 생성할 인스턴스를 가리키는 자기 참조 변수(self-reference variable)이다

우선 정의는 저렇다. 3번째 자신이 속한 객체 또는 자신이 생성 할 인스턴스 저것만 기억하면 될 것 같다.

저기 "자신이 속한 객체" 이놈이 중요한데, 이 말을 풀어서 보면 this를 누가 호출 하느냐. 가 핵심이다

 

핵심 : this는 호출하는 녀석에 따라 달라진다. (동적)

 

그럼 바로 예제를 보면서 이해해보자.

 

 

예제

============================================================================

var obj = {
  name : 'bome',
  thisFunction : function(){
    console.log(this);
  }
}

obj.thisFunction();

이렇게 작성을 하면 thisFunction메서드 안에 있는 this는 누구를 바라볼까??? 

다시 한번 생각해보자. this는 누가 호출했느냐로 동적으로 바뀐다. 여기서 thisFunction이라는 메서드를

호출한건 누구인가?

 

obj.thisFunction();

 

그렇다 객체인 obj가 thisFunction을 호출하였다. 그럼 결과는?

 

짠, 콘솔에 obj객체가 찍히는 것을 확인 할 수 있다. 그럼 만약 아래와 같이 코드를 작성하면 어떻게 될까?

 

var obj = {
  name : 'bome',
  thisFunction : function(){
    console.log(this);
  }
}

var notObj = obj.thisFunction;
notObj();

 

기존 코드는 그대로인데.. 아래에 notObj라는 변수를 선언하고 그 안에 thisFunction메서드를 넣어주고

notObj함수를 실행시켰다. 또 생각해보자.

 

누가 thisFunction을 호출하였는가?? notObj가 호출하였다. notObj는 무엇인가? 전역변수(글로벌)이다.

이제 어떻게 나올 지 대충 예상이 간다. 아래는 결과이다.

 

codepen에서 window는 안찍어줌...

 

 

하나만 더 해보자..

 

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div>
    <button id="btn"> 버튼 </button>
  </div>
  <script>
        var obj = {
          name : 'bome',
          thisFunction : function(){
            console.log(this);
          }
        }

        var btn = document.getElementById('btn');
        btn.addEventListener('click', obj.thisFunction);
   </script>
</body>
</html>

 

코드를 이렇게 작성하였다. 지겹겠지만, 누가 thisFunction을 호출하였는가? 

id값이 btn인 녀석을 btn이라는 변수로 선언한 뒤, btn에 click이벤트를 추가하였고, 클릭 했을 때

obj객체 안의 thisFunction을 호출해라! 이다.

 

그럼 누가 thisFunction을 호출하였는가? 정답은 btn이 호출하였다. 그럼 결과는??

 

 

this는 id값이 btn인 저 <button>을 바라보게 된다.. 

이렇게 몇개 풀어보니 대충 감이 올 것이다.

하나만 기억하자. 기본함수에서의 this는 자신을 호출한 녀석을 바라본다

 

 

Arrow Function

============================================================================

 

Arrow Function의 this는 저번에도 글을 썼다 ( 링크 )

그래서 여기서는 간단히 예제만 보겠다..

 

핵심 : Arrow Function에서는 this를 가지지 않으므로, javascript의 특성인 찾는 게 없으면 상위 스코프로 범위를

넓혀가며 찾는다. => Arrow Function에서의 this는 상위 스코프를 바라본다.

 

var obj = {
  test : function(){
     let arrow = () =>{
       console.log(this);
     }
     arrow();
  }
}

obj.test();

이렇게 작성하면 arrow()를 누가 호출하는가? 위의 ES5문법으로 보면 이 녀석은 Window가 호출했다.

그럼 this는 Window를 바라봐야 되는 것인데.. 여기는 Arrow Function안에서의 this이기 때문에

상위 스코프인 obj를 바라보게 된다. 아래는 실행결과

 

728x90
반응형
profile

개발공작소

@모찌바라기

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!