[JavaScript] 예시를 통해 알아보는 this

2022. 12. 28. 14:46·프로그래밍 언어/JavaScript

JavaScript에서 this 는 함수 호출 방법에 의해 결정된다.

 

예시1) 객체 메소드의 this 

const phone = {
  name: 'Galaxy Note 3',
  getName: function () {
    console.log("getName: ", this);
  },
}

phone.getName();
// output: getName: {name: 'Galaxy Note 3', getName: f}

getName 메소드의 호출자가 phone 객체이므로, getName 실행 시 this 는 phone 객체이다.

 

예시2) 전역 객체에서의 this

const phone = {
  name: 'Galaxy Note 3',
  getName: function () {
    console.log("getName: ", this);
  },
}

const globalPhone = phone.getName;
globalPhone();
// output: getName: Window

getName 메소드를 참조하는 globalPhone 의 호출자가 전역 객체이므로,  globalPhone 실행 시 this 는 window 객체이다.

 

예시3) DOM 이벤트 핸들러에서의 this

<body>
  <button id="button">this란 무엇일까?</button>
</body>
const phone = {
  name: 'Galaxy Note 3',
  getName: function () {
    console.log("getName: ", this);
  },
}

const btn = document.getElementById("button");
btn.addEventListener("click", phone.getName);
// output: getName: btn요소

car 객체의 getName 메소드의 호출자가 btn 이므로, 여기서 this 는 btn DOM 객체이다. 

 

예시4) bind 를 통해서 this 값 고정

const phone = {
  name: 'Galaxy Note 3',
  getName: function () {
    console.log("getName: ", this);
  },
}

phone.getName();
// output: getName: {name: 'Galaxy Note 3', getName: f}

const phone2 = {
  name: 'Iphone Mini',
  getName: function () {
    console.log("getName: ", this);
  },
}

phone2.getName();
// output: getName: {name: 'Iphone Mini', getName: f}

phone2.getName.bind(phone);
// output: getName: {name: 'Galaxy Note 3', getName: f}

bind 메소드로 호출자를 phone 객체로 지정한 채 getName 메소드 호출 시 this는 phone 객체이다.

 

예시5) 객체 메소드 내에 정의된 내부 함수에서의 this

const phone = {
  name: 'Galaxy Note 3',
  getName: function () {
    console.log("getName: ", this.name);
    const innerFunc = function () {
      console.log(this.name);
    };
    innerFunc();
  },
}

phone.getName();
// output:
// getName: Galaxy Note 3
// undefined

getName 의 호출자가 phone 객체이므로 getName 의 this 값은 phone 객체이다. 이어서 당연히 innerFunc은 getName 메소드 내에 정의되어 있기 때문에 innerFunc의 this 값 또한 phone 객체라고 생각할 지도 모른다.

그러나 이는 함수가 선언된 관점에서 바라보았기 때문에 틀린 말이다. 앞서 언급했다시피 this 값은 함수가 호출될 때 결정된다.

innerFunc 함수의 호출자는 전역 객체이므로 innerFunc 함수의 this 값은 전역 객체이다.

 

innerFunc 함수의 this 값을 부모 함수인 getName 과 일치시키고 싶다면 innerFunc 함수를 화살표 함수 형태로 선언하면 된다.

const phone = {
  name: 'Galaxy Note 3',
  getName: function () {
    console.log(this);
    const innerFunc = () => {
      console.log(this);
    };
    innerFunc();
  },
}

phone.getName();
// output:
// {name: 'Galaxy Note 3', getName: ƒ}
// {name: 'Galaxy Note 3', getName: ƒ}

화살표 함수에서의 this는 함수가 속해 있는 곳의 상위 this를 참조한다.

즉 위 코드에서 화살표 함수인 innerFunc의 this 는 함수가 속해 있는 곳인 getName의 this를 그대로 참조한다.

'프로그래밍 언어 > JavaScript' 카테고리의 다른 글

[JavaScript] 커링  (0) 2023.01.12
[JavaScript] iterable 객체  (0) 2023.01.11
[JavaScript] 문자열 자르기 (substr, substring, slice)  (0) 2022.12.05
JavaScript 의 동작방식  (0) 2022.11.12
[JavaScript] 반복문  (0) 2022.11.05
'프로그래밍 언어/JavaScript' 카테고리의 다른 글
  • [JavaScript] 커링
  • [JavaScript] iterable 객체
  • [JavaScript] 문자열 자르기 (substr, substring, slice)
  • JavaScript 의 동작방식
rondeveloper
rondeveloper
  • rondeveloper
    Ron's learning record
    rondeveloper
  • 전체
    오늘
    어제
    • 분류 전체보기 (99)
      • k8s (1)
      • AWS (1)
      • 리눅스 (3)
      • Docker (8)
      • 라이브러리 & 프레임워크 (14)
        • React (2)
        • NestJS (8)
        • Spring (0)
        • Django (3)
        • FastAPI (1)
      • 웹 (2)
        • Nginx (1)
      • 프로그래밍 언어 (29)
        • HTML (0)
        • CSS (0)
        • JavaScript (21)
        • Python (3)
        • Node.js (0)
        • TypeScript (4)
        • Java (1)
      • Today I learned (9)
      • 알고리즘 (9)
        • 백준 (0)
        • 프로그래머스 (8)
        • 개념 (1)
      • 티끌모아 태산 (5)
        • 하루에 영단어 하나씩 (5)
        • 독서 (0)
      • 시행착오 (3)
      • 데이터베이스 (2)
        • MySQL (0)
      • 컴퓨터 과학 (8)
        • 네트워크 (2)
        • 운영체제 (0)
        • 데이터베이스 (2)
        • 자료구조 (4)
      • 포트폴리오 (4)
        • JJINCAFE IN SEOUL (4)
        • CODEUNICORN (0)
      • 회고 (0)
      • CICD (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    typeorm
    생활코딩
    django
    기초
    mysql
    Kubectl
    Python
    컨테이너
    레벨2
    네트워크
    도커
    조인
    IP 주소
    javascript
    자바스크립트
    Til
    nestjs
    스택
    프로그래머스
    배열
    Kubernetes
    FastAPI
    모듈
    코딩테스트
    iterable
    쿠버네티스
    typescript
    리눅스
    redis
    Docker
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
rondeveloper
[JavaScript] 예시를 통해 알아보는 this
상단으로

티스토리툴바