JavaScript this binding

agnusdei·2023년 7월 13일
0

JavaScript에서 this는 실행 컨텍스트에 따라 동적으로 결정되는 특별한 키워드입니다. this를 사용하면 현재 실행 중인 함수나 메서드가 속한 객체에 대한 참조를 얻을 수 있습니다. this 바인딩은 함수를 호출할 때 어떻게 결정되는지에 대한 메커니즘입니다. this를 바인딩하는 방법은 다음과 같이 여러 가지 규칙에 따라 결정됩니다.

  1. 전역 컨텍스트에서 this

    • 전역 컨텍스트에서 this는 전역 객체(window 또는 global 객체)를 참조합니다.
    • 브라우저 환경에서 전역 컨텍스트에서의 thiswindow 객체를 가리킵니다.
  2. 함수 내부에서 this

    • 함수 내부에서 this는 실행 시점에 따라 다르게 결정됩니다.
    • 함수를 일반적인 함수로 호출하면 this는 전역 객체(window)를 참조합니다.
    • 객체의 메서드로 호출된 함수에서 this는 해당 메서드를 호출한 객체를 참조합니다.
  3. 메서드 체이닝에서 this

    • 메서드 체이닝 중인 경우, this는 체인의 현재 객체를 참조합니다.
    • 메서드 체인에서 this는 바로 앞의 메서드가 반환한 객체를 가리킵니다.
  4. 생성자 함수에서 this

    • 생성자 함수 내부에서 this는 새로 생성되는 객체를 참조합니다.
    • 생성자 함수로 객체를 생성할 때 new 키워드를 사용하면 this는 새로 생성된 객체를 가리킵니다.
  5. 이벤트 핸들러에서 this

    • 이벤트 핸들러 내부에서 this는 해당 이벤트가 발생한 요소(element)를 참조합니다.
  6. 화살표 함수에서 this

    • 화살표 함수에서 this는 함수를 정의할 때의 바깥 스코프의 this 값을 유지합니다. 즉, 화살표 함수는 자체적인 this를 가지지 않습니다.

this 바인딩을 이해하고 활용하면 함수의 컨텍스트에 따라 다른 객체에 접근하고 상호작용할 수 있습니다. 이를 통해 코드의 유연성과 재사용성을 높일 수 있습니다. 그러나 this를 사용할 때 주의해야 할 점은 함수의 호출 방식에 따라 this 바인딩이 달라질 수 있다는 것입니다.

this를 바인딩하는 방법에는 여러 가지가 있습니다. 아래 예시들을 통해 각각의 방법을 살펴보겠습니다.

  1. 메서드 내부에서 this 바인딩하기
const obj = {
  name: 'John',
  sayHello: function() {
    console.log(`Hello, ${this.name}!`);
  }
};

obj.sayHello(); // 출력: Hello, John!

위의 예시에서 obj 객체의 sayHello 메서드 내부에서 this.name을 사용하여 객체의 name 속성에 접근합니다. this는 메서드가 호출된 객체인 obj를 참조하므로 this.nameobj.name과 동일한 값을 출력합니다.

  1. 생성자 함수에서 this 바인딩하기
function Person(name) {
  this.name = name;
  this.sayHello = function() {
    console.log(`Hello, ${this.name}!`);
  };
}

const john = new Person('John');
john.sayHello(); // 출력: Hello, John!

위의 예시에서 Person이라는 생성자 함수를 정의하고, new 키워드를 사용하여 john이라는 새로운 객체를 생성합니다. Person 생성자 함수 내부에서 this.namethis.sayHello는 생성된 객체에 속성과 메서드로 바인딩됩니다.

  1. bind() 메서드를 사용하여 this 바인딩하기
const obj = {
  name: 'John',
  sayHello: function() {
    console.log(`Hello, ${this.name}!`);
  }
};

const boundSayHello = obj.sayHello.bind(obj);
boundSayHello(); // 출력: Hello, John!

위의 예시에서 bind() 메서드를 사용하여 obj.sayHello 메서드를 obj 객체에 바인딩하여 새로운 함수 boundSayHello를 생성합니다. boundSayHello()를 호출하면 thisobj 객체를 참조하므로 Hello, John!이 출력됩니다.

  1. 화살표 함수를 사용하여 this 바인딩 피하기
const obj = {
  name: 'John',
  sayHello: () => {
    console.log(`Hello, ${this.name}!`);
  }
};

obj.sayHello(); // 출력: Hello, undefined!

위의 예시에서 sayHello 메서드는 화살표 함수로 정의되어 있습니다. 화살표 함수는 자체적인 this를 가지지 않고, 바깥 스코프의 this 값을 유지합니다. 따라서 this.nameundefined를 출력하게 됩니다.

위의 예시들은 일부 this 바인딩의 예시입니다. 각각의 방법은 다른 상황에 맞게 사용될 수 있습니다. 메서드 내부에서 this를 사용하거나, 생성자 함수를 사용하여 객체를 생성하거나, bind() 메서드를 사용하여 this를 바인딩하거나, 화살표 함수를 사용하는 등 다양한 방법으로 this를 바인딩할 수 있습니다. 선택한 방법은 사용하려는 상황과 요구에 따라 달라질 수 있습니다.

0개의 댓글