화살표 함수는 ES6부터 새로 생긴 표현식입니다.
화살표 함수는 익명 함수를 좀 더 간단히 쓰는 표현식입니다.
표현식
화살표 함수의 표현식은 아래와 같습니다.
var a = (x) => { return x; };
var a = (x1, x2) => { return x1 + x2; };
여기서 인수가 하나만 있다면 괄호를 지우고 사용이 가능합니다.
var a = x => { return x; };
리턴 값만 있다면 return과 {} 중괄호를 지우고 사용이 가능합니다.
var a = x => x;
인수의 기본값, 나머지 매개변수를 설정하여 사용도 가능합니다.
// 기본값 매개변수
var a = (x1=1, x2=2, x3) => { return x1 + x2 + x3; };
a(undefined,undefined,2); // -> 5
// 나머지 매개변수
var a = (...x) => { return x[0] + x[1]; };
a(1,5); // -> 6
반환 값이 객체 리터럴이라면 괄호를 붙여야 합니다.
var a = () => ({ A:1 });
a(); // -> { A:1 }
참고로 인수가 없다면 괄호를 생략할 수 없습니다.
화살표 함수의 특징
1. 화살표 함수의 this값은 화살표 함수의 바깥의 범위에 있는 this값을 가지게 됩니다.
var a = {
test1 : "a",
test2 : () => console.log(this), // -> Window {window: Window, self: Window, document: #document, name: '', location: Location, …}
test3 : function () {
var b = () => console.log(this); // -> {test1: 'a', test2: ƒ, test3: ƒ}
b();
}
}
a.test2();
a.test3();
따라서 test2의 화살표 함수는 전역 객체를 가리키고 test3의 내부 함수인 b의 화살표 함수의 this는 a 객체를 가리킵니다.
2. 화살표 함수는 call, apply 함수의 this가 적용되지 않습니다. call함수와 apply 함수의 주는 인자는 정상적으로 넘어가 정상적으로 실행이 되지만 this는 변함이 없습니다.
var a = function(x1, x2) { console.log( this.x + " " + x1 + " " + x2); };
var ab = (x1, x2) => { console.log( this.x + " " + x1 + " " + x2); };
var c = { x : 10 };
a.call(c,1,2); // -> 10 1 2
ab.call(c,1,2); // -> undefined 1 2
3. 화살표 함수는 arguments 객체가 없기 때문에 따로 인수를 가져오지 못합니다. 따라서 arguments를 대신하여 나머지 매개변수를 사용하여 인자를 가져와 사용할 수 있습니다.
4. 화살표 함수는 new 연산자를 사용할 수 없으며 생성자 역할이 불가능합니다.
5. 화살표 함수는 yield 키워드를 사용할 수 없습니다. 따라서 제너레이터로 사용하지 못합니다.
글에 오류가 있을 수도 있으니 알려주시면 감사하겠습니다.
참고
모던 자바스크립트 입문(이소 히로시 지음, 서재원 옮김)
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Functions/Arrow_functions
'프로그래밍 > JavaScript(JS)' 카테고리의 다른 글
자바스크립트(JavaScript) - 프로토타입(Prototype) (0) | 2021.10.13 |
---|---|
자바스크립트(JavaScript) - 이터레이터(Iterator), 이터러블(Iterable), 제너레이터(Generator) (0) | 2021.09.29 |
자바스크립트(JavaScript) - 클로저(Closure) (0) | 2021.09.23 |
자바스크립트(JavaScript) - Execution Context(실행 문맥)과 코드 실행 및 내부 동작 원리 (0) | 2021.09.23 |
자바스크립트(JavaScript) - 템플릿 리터럴(Template literals) (0) | 2021.09.06 |