화살표 함수는 언제, 왜 써야할까?

2020. 10. 30. 19:21·프론트엔드/Javascript

Answer

1. 코드의 간결성

2. 콜백함수 this에 값을 참조시킬때  (this 값에 lexical scope를 참조시킬 때) 

3. map 사용할 때 this를 넘격주어 코드를 더 쉽게 작성할 수 있음.

 

 

들어가기전

자바스크립트에서

일반 함수는 함수를 선언할 때 this에 바인딩할 객체가 동적으로 결정된다.

즉, 함수를 호출할 때 함수가 어떻게 호출되었는지에 따라 this에 바인딩할 객체가 결정된다.

this에 대해선 아래 링크 참고

poiemaweb.com/js-this

 

반면, 화살표 함수에서는 함수를 선언할 때 this에 바인딩할 객체가 정적으로 결정된다.

일반 함수와 달리 언제나 상위 스코프의 this를 가리킨다. 이를 Lexical this라고 한다.

 

this와 Arrow function

 

this를 바인딩할 때 왜 화살표함수를 쓰는지 한가지 문제 상황을 살펴보겠다.

아래 콜백함수는 undefined를 출력하고 있다.

콜백함수(setTimeout) 내부의 this는 전역 객체 window를 가리킨다.

myVar 프로퍼티는 window가 아니라 obj의 프로퍼티이기 때문에 오류가 발생한 것이다.

let obj = {
  myVar: 'foo',
  
  myFunc: function() { 
    console.log(this.myVar)   
 
    setTimeout(function() {
      console.log(this.myVar)
    }, 1000)
  }
}
obj.myFunc() // foo ... then... undefined

 

이것을 해결하기 위한 3가지 방법을 소개하겠다.

 

1. this를 변수에 할당하는 것이다. 

let obj = {
  myVar: 'foo',
  
  myFunc: function() { 
    let self = this
    console.log(this.myVar)  
  
    setTimeout(function() {
      console.log(self.myVar)
    }, 1000)
  }
}
obj.myFunc() // foo ... then... foo

2. 두번 째 방법은 bind,call,apply를 활용하는 것이다.

let obj = {
  myVar: 'foo',
  
  myFunc: function() { 
    console.log(this.myVar)  
  
    setTimeout(function() {
      console.log(this.myVar)
    }.bind(this), 1000)
  }
}
obj.myFunc() // foo ... then... foo

3. 세번 째 방법은 아래 arrow function을 사용하는 것이다. (가장 명확한 솔루션)

let obj = {
  myVar: 'foo',
  
  myFunc: function() { 
    console.log(this.myVar)  
  
    setTimeout(() => {
      console.log(this.myVar)
    }, 1000)
  }
}
obj.myFunc() // foo ... then... foo

 

 

 

 

 

Ref

freestrokes.tistory.com/103

medium.com/tfogo/advantages-and-pitfalls-of-arrow-functions-a16f0835799e#:~:text=The%20takeaway%3A%20Function%20expressions%20are,of%20this%20in%20their%20scope.

'프론트엔드 > Javascript' 카테고리의 다른 글

잊을만하면 찾아왔던 오디오 재생버그  (0) 2023.08.21
사파리 비동기 함수에서 window.open 우회하기  (0) 2023.07.02
JavaScript- require vs import (CommonJs와 ES6) 차이점  (0) 2020.10.30
실행 컨텍스트 정리  (0) 2020.10.23
이벤트 버블링, 캡쳐링, 위임  (0) 2020.10.21
'프론트엔드/Javascript' 카테고리의 다른 글
  • 잊을만하면 찾아왔던 오디오 재생버그
  • 사파리 비동기 함수에서 window.open 우회하기
  • JavaScript- require vs import (CommonJs와 ES6) 차이점
  • 실행 컨텍스트 정리
꿀표
꿀표
양봉업자
  • 꿀표
    꿀로그
    꿀표
  • 전체
    오늘
    어제
    • 분류 전체보기 (82)
      • 인디해커 (0)
      • AI (0)
      • 프론트엔드 (34)
        • Javascript (17)
        • React (9)
        • Git (2)
        • Web Env (4)
        • Typescript (1)
        • 웹접근성 (1)
        • 상태관리 (0)
      • CS (8)
        • Network (3)
        • 알고리즘 (5)
      • 글쓰기 (3)
        • 생각 (2)
        • 서적 (1)
      • JAVA (37)
        • JAVA 기초 (22)
        • JSP (15)
  • 블로그 메뉴

    • 방명록
  • 인기 글

  • 태그

    js
    javascript
    greedy
    구명보트
    cross browsing
    react
    프로그래머스
    알고리즘
    network
    그리디
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
꿀표
화살표 함수는 언제, 왜 써야할까?
상단으로

티스토리툴바