ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Javascript] this와 화살표 함수
    Javascript 2024. 2. 25. 21:44

    this 란?

    • javascript에서의 this는 자신이 속한 객체 또는 자신이 생성할 인스턴스를 가리키는 자기 참조 변수

     

     

    this의 특징

    📌 this 바인딩

    • this가 가리키는 값(this 바인딩)은 함수가 선언된 방식이 아니라 함수를 호출하는 방식에 의해 동적으로 결정됨
    // 1. 전역
    console.log(this); // window => 전역 객체
    
    // 2. 일반 함수 내부
    function square(number) {
      console.log(this); // window => 전역 객체
      return number * number;
    }
    square(2);
    
    // 3. 객체 메서드 내부
    const person = {
      name: 'Lee',
      getName() {
        console.log(this); // {name: 'Lee', getName: ƒ} => 메서드를 호출한 객체
        return this.name;
      },
    };
    console.log(person.getName()); // Lee
    
    // 4. 생성자 함수
    function Person(name) {
      this.name = name;
      console.log(this); // Person {name: 'Lee'} => 생성자 함수가 생성할 인스턴스
    }
    const me = new Person('Lee');

    여러 상황에서 this가 참조하는 객체

     

    📌 apply, call, bind 메서드

    • apply, call, bind 메서드는 Function.prototype의 메서드이므로, 모든 함수가 상속받아 사용할 수 있음
    • apply, call 메서드는 함수를 호출할 때 쓰이며, 첫 번째 인자로 전달한 객체를 호출한 함수의 this에 바인딩함
      • apply 메서드는 호출할 함수의 인자를 배열의 형태로 전달
      • call 메서드는 호출할 함수의 인자를 첫 번째 인자 이후에 쉼표로 나열하여 전달
    function getThisBinding() {
      console.log(arguments);
      return this;
    }
    
    const thisArgs = { a: 1 };
    
    console.log(getThisBinding.apply(thisArgs, [1, 2, 3]));
    // Arguments(3) [1, 2, 3, callee: ƒ, Symbol(Symbol.iterator): ƒ]
    // {a: 1} => getThisBinding의 return 값
    
    console.log(getThisBinding.call(thisArgs, 1, 2, 3));
    // Arguments(3) [1, 2, 3, callee: ƒ, Symbol(Symbol.iterator): ƒ]
    // {a: 1} => getThisBinding의 return 값

    apply와 call 메서드

     

    • bind 메서드는 메서드의 this와 메서드 내부의 중첩함수, 또는 콜백 함수의 this가 불일치하는 문제를 해결하기 위해 사용됨
      • this가 새로 바인딩된 함수를 반환하므로, 함수를 실행하려면 명시적으로 호출해야함.
    function getThisBinding() {
      return this;
    }
    
    const thisArgs = { a: 1 };
    
    // thisArgs로 this가 바인딩된 새로운 함수를 생성하여 반환한다.
    console.log(getThisBinding.bind(thisArgs));     // getThisBinding 
    
    // 함수를 실행하려면 명시적으로 호출해야 한다.
    console.log(getThisBinding.bind(thisArgs)());   // {a: 1}

     

     

     

    화살표 함수(Arrow Function)

    📌 화살표 함수의 등장 배경

    • 콜백 함수 내부에서 this가 전역 객체를 가리키는 문제를 해결하기 위해 등장

     

    📌 화살표 함수의 특징

    • 일반 함수는 호출 방식에 따라 동적으로 this에 객체가 바인딩 되지만, 화살표 함수는 함수를 선언할 떄 this에 바인딩할 객체가 정적으로 결정
    • 화살표 함수 내부의 this는 언제나 상위 스코프의 this를 가리킴
    const fn = {
      title: 'Hello World!',
      tags: [1, 2],
      showTags() {
        // 객체 내부 메서드에서의 this = 객체를 가리킴
        this.tags.forEach(function (tag) {
          console.log(tag);
          console.log(this); // window
          // => 콜백 함수가 일반 함수로서 호출되어 전역 객체를 가리킴
        });
      },
    };
    fn.showTags();
    
    const arrfn = {
      title: 'Hello World!',
      tags: [1, 2],
      showTags() {
        this.tags.forEach((tag) => {
          console.log(tag);
          console.log(this); // {title: 'Hello World!', tags: Array(2), showTags: ƒ}
          // 콜백 함수가 arrow function인 경우 상위 스코프의 this를 가리킴
        });
      },
    };
    arrfn.showTags();

    'Javascript' 카테고리의 다른 글

    [Javascript] 콜백 함수와 Promise  (4) 2024.02.06
    [Javascript] Javascript의 특징  (0) 2024.01.25
Designed by Tistory.