JavaScript

Arrow Function

김꼬알 2023. 5. 30. 11:43

Arrow Function

Arrow 의 사전적 의미는 화살, 화살표 => (화살표 함수)

 

코드 형태

(param) => {함수 코드}
const add = function(one, two){
    return one + two;
};
log(add(1, 2));

const total = (one, two) => {    // function 키워드 대신에 화살표 => 사용
    return one + two;
};
log(total(1, 2));

[실행 결과]

3

3

 

  • function(){}의 축약 형태이지만 고려할 사항도 있음(this 참조가 다름)

 

 

함수 블록 사용

  • 함수 블록과 return 작성 생략
const total = (one, two) => one + two;    // 함수 블록 {}과 return을 생략한 형태로 {return one + two}와 같음
log(total(1, 2));

[실행 결과]

3

 

  • 함수 블록{}만 작성한 형태
const total = (one) => {};    // {} 만 작성하면 함수 블록에 rerutn을 작성하지 않은 것과 같으므로 undefined를 반환함
log(total(1));

[실행 결과]

undefined

 

  • {key:value}를 반환하는 형태
const point = (param) => ({book: param});    // {key:value}를 소괄호()로 감싸면 {key:value}를 반환함
const result = point("책");
for (const key in result){
    log(key + ": " + result[key]);
};

[실행 결과]

book: 책

 

 

파라미터 사용

  • 파라미터가 하나일 때
const get = param => param + 20;    // 파라미터가 하나이면 (param)에서 소괄호를 생략할 수 있음
log(get(10));    // get(10)에서 10이 param에 설정됨

[실행 결과]

30

 

  • 파라미터가 없으면 소괄호만 작성
const get = () => 10 + 20;    // 파라미터가 없으면 소괄호만 작성할 수 있음
log(get());

[실행 결과]

30

 

 

화살표 함수 구조

  • function을 => 로 표기하는 것이 전부가 아님
  • 화살표 함수는 일반 함수와 구조가 다르며, 특징이 있음
    • prototype과 constructor가 없음
    • prototype에 메소드를 연결하여 확장할 수 없음
    • prototype이 없으므로 그만큼 가벼움
    • new 연산자로 인스턴스를 생성할 수 없음

 

  • arguments 사용 불가
  • arguments 대신에 rest 파라미터 사용

 

 

화살표 함수와 this

  • strict 모드에서 함수를 호출할 때 함수 앞에서 오브젝트 작성은 필수
"use strict"
function book(){
    function getPoint(){
        log(this);
    };
    getPoint();
    // window.getPoint();    // window를 앞에 작성하지 않으면 this 값이 undefined
};
window.book();    // strict 모드에서는 window.book()처럼 호출하는 함수 앞에 오브젝트를 작성해야 함

[실행 결과]

undefined

 

  • 화살표 함수로 해결
"use strict"
var point = 100;
function sports(){
    const getPoint = () => {
        log(this.point);    // getPoint() 화살표 함수 안에서 this가 window 오브젝트를 참조
    };
    getPoint();    // 화살표 함수로 getPoint() 호출 가능
};
window.sports();

[실행 결과]

100

 

  • 화살표 함수에서 this가 글로벌 오브젝트를 참조(this 값이 undefined)
  • 화살표 함수는 함수에 this를 갖고 있지 않기 때문에, this가 window 오브젝트를 참조

 

this가 정적 스코프 참조

  • 화살표 함수에서 정적 스코프의 this를 사용
  • 정적(Lexical) 스코프란
  • 엔진이 해석할 때, 화살표 함수를 만나면 function 오브젝트를 생성하고 화살표 함수가 속한 스코프를 생성한 오브젝트에 바인딩
  • 오브젝트에 바인딩된 스코프의 this를 화살표 함수에서 this로 사용
var title = "책";
const book = {
    show: () => log(this.title)    // 함수 밖 스코프의 변수를 사용하듯이 show()의 스코프인 book 오ㅓ브젝트에 설정된 this를 화살표 함수에서 사용
};
book.show();    // book 오브젝트가 글로벌 오브젝트에 설정되므로 this가 window 오브젝트를 참조

[실행 결과]

 

 

화살표 함수와 인스턴스

  • 인스턴스에서 화살표 함수의 작성 위치에 따라 this가 참조하는 오브젝트가 다름
  • prototype에 메소드로 작성
var point = 200;
const Point = function(){
    this.point = 100;
};
Point.prototype.getPoint = () => {    // prototype에 화살표 함수를 연결하면 함수 안에서 this가 글로벌 오브젝트 참조
    log(this.point);    // 글로벌 오브젝트의 point 값인 200을 출력
};
new Point().getPoint();

[실행 결과]

200

 

  • prototype의 메소드 안에 작성
const Point = function(){
    this.point = 100;
};
Point.prototype.getPoint = function(){    // 화살표 함수의 스코프인 getPoint()의 this를 사용하기 때문
    const add = () => this.point + 20;    // 화살표 함수에서도 this가 생성한 인스턴스 참조
    log(add());
    [1, 2].forEach((value) => {
        log(this.point + value);
    })
};
new Point().getPoint();    // getPoint()가 일반 함수이므로 this가 생성한 인스턴스 참조

[실행 결과]

120

101

102

 

 

화살표 함수 특징

  • fuction 대신 => 를 사용, 함수 표현식 형태
    • ptototype이 없으므로 함수가 가벼움
    • constructor가 없으므로 new 연산자로 인스턴스를 생성할 수 없음
  • 화살표 함수에 this가 없음
    • 화살표 함수로 function 오브젝트를 생성할 때 정적으로 화살표 함수가 속한 스코프의 this를 화살표 함수에 바인딩함
    • 바인딩된 this 참조가 바뀌지 않으며 화살표 함수에서 this로 사용함
    • 일반 함수는 call() 등으로 바꿀 수 있음
  • 메소드보다 함수로 사용하는 것이 효율성이 높음