Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

JAN's History

화살표 함수 vs 일반 함수: this를 더 쉽게 이해하기! 🚀 본문

Javascript

화살표 함수 vs 일반 함수: this를 더 쉽게 이해하기! 🚀

JANNNNNN 2024. 10. 17. 22:07

안녕하세요, 여러분! 오늘은 자바스크립트에서 함수의 종류와 this 키워드에 대해 조금 더 깊이 이야기를 나눠보려 해요. 특히, 화살표 함수와 일반 함수의 차이점이 this를 어떻게 다르게 처리하는지 알아보겠습니다. 그럼 시작해 볼까요? 🧐

 

자바스크립트에서 this는 경우에 따라 참조하는 객체가 달라져서 혼란스러울 수 있습니다. this의 값은 함수가 호출될 때 결정되는데, 이 점이 두 가지 함수 유형의 주요 차이점이 됩니다: 화살표 함수와 일반 함수입니다.

1. this란 무엇인가? 🤓

먼저, this에 대해서 간단히 살펴보죠. this는 현재 코드 실행의 컨텍스트를 나타내는 특별한 키워드입니다. 즉, this가 가리키는 대상은 코드가 어떻게 호출되었는지에 따라 달라질 수 있습니다. 객체의 메서드로 호출되면 그 객체를, 전역 컨텍스트에서는 전역 객체를 가리키게 됩니다. 따라서 this의 정확한 의미를 이해하는 것이 자바스크립트를 효과적으로 사용하는 데 필수적입니다.

  • 함수 내에서의 this:
    • 일반 호출: 일반 함수로 호출될 경우, this는 전역 객체를 참조합니다.
    • 메서드 호출: 객체의 메서드로 호출하면, this는 해당 객체를 참조합니다.
  • 화살표 함수: 화살표 함수는 자체적인 this를 가지지 않고, 외부의 this를 참조합니다.
  • 생성자 함수: new 키워드를 사용하여 생성자 함수로 호출하면, this는 새로운 객체를 참조합니다.
  • bind, call, apply: 이 메서드들을 사용하면 this의 값을 명시적으로 설정할 수 있습니다.

2. 화살표 함수 🌟

화살표 함수는 ES6에서 도입된 기능으로, 정적 바인딩을 지원합니다. 화살표 함수를 정의할 때의 this 값을 그대로 가져오기에, 호출되는 위치와 상관없이 this가 항상 같은 객체를 참조합니다. 이로 인해 bind를 사용할 필요가 없죠! 아래 예시를 확인해 보세요:

class Counter {
    constructor() {
        this.count = 0;
    }

    increment() {
        setTimeout(() => {
            this.count++; // 화살표 함수 내의 this는 Counter 인스턴스를 참조
            console.log(this.count);
        }, 1000);
    }
}

const counter = new Counter();
counter.increment(); // 1

위의 예시에서 setTimeout 안의 화살표 함수는 this Counter 클래스의 인스턴스를 가리키므로, this.count는 정상적으로 증가합니다. 화살표 함수 덕분에 코드가 훨씬 간결하고 쉽게 이해할 수 있죠!

3. 일반 함수 🛠️

반면, 일반 함수는 동적 바인딩을 사용합니다. 이는 함수가 호출될 때 this가 결정된다는 의미인데요. 예를 들어, 다음과 같은 경우를 살펴볼까요?

class Counter {
    constructor() {
        this.count = 0;
    }

    increment() {
        setTimeout(function() {
            this.count++; // this는 undefined 혹은 전역 객체를 참조
            console.log(this.count);
        }, 1000);
    }
}

const counter = new Counter();
counter.increment(); // NaN 또는 TypeError

위의 코드에서 일반 함수는 this가 Counter 인스턴스를 가리키지 않게 됩니다. setTimeout 내부의 일반 함수는 새로운 컨텍스트에서 호출되므로 this는 undefined가 되기 때문이에요. 이를 해결하기 위해 bind 메서드를 사용하여 명시적으로 this를 바인딩할 수 있습니다.

setTimeout(function() {
    this.count++;
    console.log(this.count);
}.bind(this), 1000); // bind로 this를 명시적으로 바인딩

2. call과 bind의 차이

call bind는 모두 this의 값을 설정하는 방법이지만, 사용 방법과 결과가 다른데요.

call 메서드

  • call 메서드는 함수를 즉시 호출하면서, this의 값을 지정할 수 있습니다.
  • 첫 번째 인자로 this로 사용할 객체를 전달하고, 이후 인자는 함수에 전달될 인자들입니다.
function greet() {
  console.log(`Hello, ${this.name}`);
}

const obj = { name: 'Alice' };
greet.call(obj); // Hello, Alice

bind 메서드

  • bind 메서드는 특정 객체에 this를 고정한 새로운 함수를 생성합니다.
  • 즉시 실행되지 않고, 나중에 호출할 수 있는 함수를 반환합니다.
function greet() {
  console.log(`Hello, ${this.name}`);
}

const obj = { name: 'Bob' };
const greetBob = greet.bind(obj);
greetBob(); // Hello, Bob

요약

  • call: 함수를 즉시 실행하면서 this를 설정합니다.
  • bind: this를 고정한 새로운 함수를 반환하며, 나중에 호출할 수 있게 합니다.

결론: 어떤 함수를 선택해야 할까? 🤔

결국 선택은 여러분의 필요와 상황에 따라 다르지만, 일반 함수를 호출할 때에는 명시적으로 this를 바인딩해주는 것이 중요하답니다! 이제 여러분도 자바스크립트에서 this를 다루는 데 한층 더 자신감을 가질 수 있게 되었기를 바랍니다! 😄 궁금한 점이 있다면 댓글로 남겨주시고, 다음에 또 만나요! 💖