[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)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바