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
복사했습니다!