화살표 함수와 일반 함수의 this 바인딩 차이

shooting star·2024년 7월 9일
post-thumbnail

화살표 함수와 일반 함수의 this 바인딩 차이

리액트 개발자라면 화살표 함수와 일반 함수의 가장 큰 차이점이 바로 this 바인딩이라는 것을 알고 있어야 합니다. 이 차이점은 리액트의 클래스 컴포넌트에서 특히 중요하게 작용합니다. 이번 글에서는 this에 대한 기본 개념을 설명하고, 리액트 클래스 컴포넌트에서 화살표 함수와 일반 함수가 this를 어떻게 다르게 처리하는지 살펴보겠습니다.

this란 무엇인가?

this는 자신이 속한 객체나 자신이 생성할 인스턴스를 가리키는 값입니다. 일반 함수에서는 함수가 호출되는 방식에 따라 this가 동적으로 결정됩니다. 즉, 함수가 일반 함수로 호출되면 그 내부의 this는 전역 객체를 가리키게 됩니다.

화살표 함수의 this 바인딩

화살표 함수는 함수 자체의 바인딩을 가지지 않습니다. 따라서 화살표 함수 내부에서 this를 참조하면 상위 스코프의 this를 그대로 따르게 됩니다. 이를 통해 클래스 컴포넌트에서 this를 일관되게 사용할 수 있습니다.

예제: 리액트 클래스 컴포넌트에서의 this 바인딩

다음 예제는 리액트 클래스 컴포넌트에서 화살표 함수와 일반 함수의 this 바인딩 차이를 보여줍니다.

import React, { Component } from 'react';

class MyComponent extends Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    };
    // 일반 함수 바인딩
    this.handleClick = this.handleClick.bind(this);
  }

  // 일반 함수로 정의된 메서드
  handleClick() {
    this.setState({ count: this.state.count + 1 });
  }

  // 화살표 함수로 정의된 메서드
  handleArrowClick = () => {
    this.setState({ count: this.state.count + 1 });
  };

  render() {
    return (
      <div>
        <p>Count: {this.state.count}</p>
        <button onClick={this.handleClick}>Increment with regular function</button>
        <button onClick={this.handleArrowClick}>Increment with arrow function</button>
      </div>
    );
  }
}

export default MyComponent;

위 예제에서 handleClick 메서드는 일반 함수로 정의되었기 때문에 constructor에서 this와 바인딩 해줘야 합니다. 반면, handleArrowClick 메서드는 화살표 함수로 정의되었기 때문에 별도의 바인딩 없이도 this가 클래스 인스턴스를 가리킵니다.

바벨에서의 차이점

바벨을 사용하여 화살표 함수와 일반 함수의 this 바인딩 차이를 살펴볼 수 있습니다. 화살표 함수는 상위 스코프의 this를 사용하기 때문에 미리 _this를 받아 사용하는 방식으로 컴파일됩니다. 일반 함수는 호출되는 런타임 시점에 this가 동적으로 결정됩니다.

// 화살표 함수가 컴파일된 코드
var _this = this;

var handleArrowClick = function handleArrowClick() {
  _this.setState({ count: _this.state.count + 1 });
};

결론

화살표 함수와 일반 함수의 this 바인딩 차이는 리액트 클래스 컴포넌트에서 특히 중요합니다. 화살표 함수는 this 바인딩 문제를 해결하는 데 유용하지만, 일반 함수와는 다르게 동작하므로 사용 시 주의가 필요합니다. 이 차이점을 이해하면 리액트 클래스 컴포넌트를 더 효과적으로 작성할 수 있습니다.

함수를 만들 때 주의해야 할 사항

  1. 함수의 부수효과를 최대한 억제하라: 부수효과를 줄이면 함수의 동작을 예측하기 쉽고 테스트하기 쉬워집니다.
  2. 가능한 한 함수를 작게 만들어라: 작은 함수는 재사용성이 높고, 유지보수가 쉬우며, 이해하기 쉽습니다.
  3. 누구나 이해할 수 있는 이름을 붙여라: 함수 이름은 그 함수의 역할을 명확히 설명해야 합니다.

리액트에서 화살표 함수와 일반 함수의 this 바인딩 차이를 잘 이해하고 적절히 사용하면, 코드의 가독성을 높이고 버그를 줄일 수 있습니다. 이를 통해 더 안정적이고 유지보수하기 쉬운 리액트 애플리케이션을 개발할 수 있을 것입니다.

0개의 댓글