본문으로 바로가기

arrow function

category JavaScript/ES6 2020. 10. 26. 20:32

함수 선언문은 자바스크립트에서 가장 간단하게 함수를 만드는 방법 중에 하나이다

function func(a,b,c) {
    return a+b+c;
}
console.log(func(1,2,3)); // 6

더 간단하게 만드는 방법이 있다

const func = (arg1,arg2,arg3) => arg1+arg2+arg3;

console.log(func(1,2,3)); //6

화살표 함수(arrow function)라고 불리는떼 가운데 있는 화살표에서 따온 이름이다

앞에 괄호 안에는 인자를 받고 뒤에는 표현식이 온다

const func = arg => console.log(arg);

func('123'); //123

인자가 하나라면 괄호도 생략 가능

const func = () => console.log('인자가 없다면 괄호는 생략 불가능');

func(); // 인자가 없다면 괄호는 생략 불가능

인자가 없다면 괄호는 생략 불가능

 const func = (arg1,arg2) => {
    const sum = arg1 +arg2;
    return sum;
}
console.log(func(1,2));

함수가 두줄이 넘어간따면 중괄호를 써서 사용해아하며 리턴값도 명시해야한다


화살표 함수에는 일반 함수에 암묵적으로 존재하는 this가 존재하지 않는다

아래를 살펴보자

const obj ={
    category : 'fruit',
    list : ['apple', 'banana', 'orange'],

    printFruit(){
        this.list.forEach(function (v){
            console.log(this.category +':'+v);
        });
    }
}

obj.printFruit();

객체 obj에는 과일 카테고리에 사과 바나나 오렌지를 가지고 있다

printFruist 메소드에 카테고리와 과일 이름들을 출력하기를 바라고 작성한 함수이다

하지만 this.cattegory가 정상적으로 작동하지 않는 것을 볼 수 있는데

첫번째 this는 obj를 바라보고 있지만 console.log안에 있는 this는 forEach의 콜백함수로 작성된 익명함수 안의 this이기 때문에 window를 가르킨다

    printFruit(){
        this.list.forEach(function (v){
            console.log(this);
        });

this.category가 아닌 this만 출력해 보면

말한 것 처럼 전역 객체가 출력되는 것을 볼 수 있다

이를 해결하기 위해서는

    printFruit(){
        const that = this;
        this.list.forEach(function (v){
            console.log(that.category+':'+v);
        });
    }

이처럼 콜백 함수에서 닿는 스코프에 곳에 변수를 만들어 this를 저장해두고

변수를 this처럼 활용하면 된다

이게 자주 쓰이는 기법이지만 화살표 함수를 사용한다면?

    printFruit(){
        this.list.forEach(
            (v)=> console.log(this.category +': '+ v)
        );
    }

똑같이 콜백 함수 안에서 this를 사용했지만 다른 결과가 나온 것을 볼 수 있다

이는 화살표 함수는 내부에서 this를 만들어 윈도우 객체를 가르키지 않기 때문에 외부의 this를 가져다와서 사용하기 때문

'JavaScript > ES6' 카테고리의 다른 글

promise  (0) 2020.11.03
class  (0) 2020.11.03
Weakmap, Weakset  (0) 2020.10.25
Destructuring  (0) 2020.10.21
Array  (0) 2020.10.20