this
, arguments
를 가리키는 자체 바인딩을 가지고 있지 않다.(a, b, ...r) => expression
(a = 400, b = 20, c) => expression
([a, b] = [10, 20]) => expression
({a, b} = {a: 10, b: 20}) => expression
익명 함수와 화살표 함수는 함수의 이름을 생략할 수 있는 것을 보아 비슷해 보이지만, 여러가지 차이점이 존재한다.
// 기존의 익명 함수
(function (a) {
return a + 100;
});
// 1. "function"이라는 단어를 제거하고 인자와 여는 대괄호 사이에 화살표를 배치합니다.
(a) => {
return a + 100;
};
// 2. 중괄호와 "return"이라는 단어를 제거하면 반환이 암시됩니다.
(a) => a + 100;
// 3. 매개변수의 괄호를 제거합니다.
a => a + 100;
// 기존의 익명 함수
(function (a, b) {
return a + b + 100;
});
// 화살표 함수
(a, b) => a + b + 100;
const a = 4;
const b = 2;
// 기존의 익명 함수 (매개변수가 없음)
(function () {
return a + b + 100;
});
// 화살표 함수 (매개변수가 없음)
() => a + b + 100;
return
문도 마찬가지이다.return
문을 사용하지 않으면 return
이 없는 것으로 간주되어 undefined
가 반환된다.// 기존의 익명 함수
(function (a, b) {
const chuck = 42;
return a + b + chuck;
});
// 화살표 함수
(a, b) => {
const chuck = 42;
return a + b + chuck;
};
// 기존 함수
function bob(a) {
return a + 100;
}
// 화살표 함수
const bob2 = (a) => a + 100;
return
문을 사용해야 한다.const func = (x) => x * x;
// 암시적으로 x * x을 return 값으로 반환한다.
const func2 = (x, y) => {
return x + y;
};
// 블록 본문으로 작성하였기 때문에 return 문을 사용하여 명확하게 x + y 가 return 값임을 명시한다.
this
를 가지고 있지 않기 때문이다.아래 코드 예시를 보면, b
프로퍼티는 this
를 사용했음에도 자체적인 this
를 가지고 있지 않아 현재 객체를 가리킬 수 없다.
'use strict';
const obj = {
i: 10,
b: () => console.log(this.i, this),
c() {
console.log(this.i, this);
}
};
obj.b(); // logs undefined, Window { /* … */ } (or the global object)
obj.c(); // logs 10, Object { /* … */ }
arguments
객체를 가지고 있지 않다.function foo(n) {
// 화살표 함수는 arguments 객체를 가지고 있지 않아, 함수 foo의 명시적 인수를 바인딩 한다.
// 따라서, arguments[0]의 값은 n이다.
const f = () => arguments[0] + n;
return f();
}
console.log(foo(3)); // 6
나머지 매개변수는 arguments
객체의 좋은 대안이 될 수 있다.
function foo(n) {
const f = (...args) => args[0] + n;
// args = [10], n = 1
return f(10);
}
foo(1); // 11
=>
는 대부분의 연산자보다 낮은 우선순위를 갖고 있기 때문에, 괄호를 이용해 에러를 방지해야 한다.let callback;
// 만약 이렇게 코드를 작성한다면 에러가 발생한다.
// =>의 연산자 우선순위는 ||보다 낮기 때문에, callback || () 연산을 먼저 진행하려고 하기 때문이다.
callback = callback || () => {};
// 괄호를 이용한 grouping은 가장 높은 우선순위를 가지고 있기 때문에, 화살표 함수가 먼저 실행되고 콜백함수와의 연산이 진행되게 된다.
callback = callback || (() => {});
📚 참고자료
MDN 화살표 함수 표현식
MDN this