화살표 함수 (Arrow Function)은 ES6의 새로운 함수 선언 방법이다.
일반 함수 표현식보다 단순하고 간결한 문법으로 함수를 만들 수 있다.
Basic 함수 선언법과 Arrow함수 선언법의 모습을 비교해보자.
Basic 함수 선언 1
function sum(a, b) { return a + b; }
Basic 함수 선언 2 : 익명함수 변수 할당
let sum = function(a, b) { return a + b; }; console.log( sum(1,2) );
Arrow함수는 function 키워드
를 생략하며, function 키워드
대신 매개변수 입력괄호 ()
만 유지해준다.
(but 인자가 한개일 경우 괄호생략)
1.expression이 한줄이라면 중괄호{}
를 생략할 수 있으며 유일한 expression 줄을 return값으로 반환한다.
=>
뒤에서 return
없이 expression을 곧바로 반환한다.2.expression이 여러줄이라면 일반함수와 동일하게 중괄호{}
와 return 지시자
를 사용해준다.
아래와 같은 이유로, 화살표 함수는 expression이 한줄인 함수를 작성할 때 유용하다.
한 줄의 expression
단일 줄의 경우 중괄호{}
와 return지시자
를 생략하고 단일의 expression을 반환 한다.
let sum = (a,b) =>{ a + b;
a+b를 반환
두 줄 이상의 expression
두 줄 이상의 expression을 작성할 경우 일반 함수처럼 중괄호{}
와 return지시자
를 사용해 준다.
let sum = (a,b) => { let c = a + b; return c
지역변수 c를 반환
매개변수 2개 이상
let sum = (a, b) => a + b;
매개변수 1개
매개변수가 한개인 경우 매개변수 자리의 괄호를 생략한다.
let double = n => n*2; // let double = function(n) { return n*2 } 과 상동
매개변수 0개
매개변수가 없는 경우 괄호 안에 아무것도 넣지 않는다.
이 경우 매개변수의 괄호와 expression의 중괄호는 생략할 수 없다.
let sayHi = () => {console.log("하위염");} sayHi();
( 상기 목록에서 괄호된 인덱스는 추가적으로 다루지 않습니다. )
화살표 함수와 일반 함수는
함수 내에 할당되는 this 객체의 바인딩 방식에서 차이가 있다.(정적/동적)
일반함수
자바스크립트에서 모든 함수는 실행될 때마다 함수 내부에 this라는 객체가 추가된다.
아래는 일반 함수에서 주어진 상황에 따라 this가 바인딩 되는 방식이다.
.
(1)함수 실행시에 this는 전역(window) 객체를 가리킨다.
(2)메소드 실행시에 this는 메소드를 소유하고 있는 객체를 가리킨다.
(3)생성자 실행시에 this는 새롭게 만들어진 객체를 가리킨다.
.
일반 함수는 함수를 선언할 때 this에 바인딩할 객체가 정적으로 결정되는 것이 아니고,
함수를 호출할 때 함수가 어떻게 호출되었는지에 따라 this에 바인딩할 객체가 동적으로 결정된다.
화살표 함수
화살표 함수는 일반함수의 this 바인딩의 동적 결정과는 다르게
함수를 선언할 때 this에 바인딩할 객체가 정적으로 결정된다.
화살표 함수의 this는 언제나 상위 스코프의 this를 가리킨다.(Lexical this)
또한 call, apply, bind 메소드를 사용하여 this를 변경할 수 없다.
( Lexical scope : https://velog.io/@he1256/JS%EC%9D%98-Lexcal-scoping-%EA%B3%BC-%ED%81%B4%EB%A1%9C%EC%A0%80Closure )
EX)
//일반함수
function fun() {
this.name = "하이";
return {
name: "바이",
speak: function () {
console.log(this.name); // 일반함수의 this는 동적함수 바인딩 규칙을 따라, 전역객체의 this를 가리켜 "바이"를 잡는다.
},
};
}
//화살표함수
function arrFun() {
this.name = "하이";
return {
name: "바이",
speak: () => {
console.log(this.name); // 화살표 함수의 this는 정적 바인딩 규칙을 따라, Lexical this를 가리켜 "하이"를 잡는다.
},
};
}
const fun1 = new fun();
fun1.speak(); // 바이
const fun2 = new arrFun();
fun2.speak(); // 하이
일반함수와 화살표 함수는 생성자 함수로 사용 가능한지 여부에도 차이가 있다.
생성자 함수로 사용 가능
function fun() { this.num = 1234; } const funA = new fun(); console.log(funA.num); // 1234
위와 같이 생성자로 사용시 정상적으로 동작한다.
생성자 함수로 사용 불가능 ( prototype 프로퍼티 미보유 )
const arrFun = () => { this.num = 1234; }; const funB = new arrFun(); // Error
위와 같이 생성자로 사용시 에러를 출력한다
일반 함수에서는 함수가 실행될 때 함수 내에 암묵적으로 arguments 변수가 전달되어 이를 함수 내에서 사용할 수 있다.
( arguments란? : 입력받은 초과 매개변수를 저장하여 활용할 수 있는 암묵적 객체, 배열과 유사하나 배열은 아니다 )
arguments : https://velog.io/@he1256/Javascript%EC%9D%98-%ED%95%A8%EC%88%98-arguments-Rest%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0-apply
하지만 사용자 함수에서는 arguments 변수가 전달되지 않는다.
function fun() { console.log(arguments); // Arguments(3) [1, 2, 3, callee: ƒ, Symbol(Symbol.iterator): ƒ] } fun(1, 2, 3);
일반 함수의 선언에서 지정한 매개변수 갯수 한도를 초과하여 전달된 인자들이 arguments 변수에 저장되어 암묵적으로 fun()함수의 내부에 전달되었다.
const arrFun = () => { console.log(arguments); // Uncaught ReferenceError: arguments is not defined }; fun(1, 2, 3);
Arrow 함수는 선언 시 매개변수의 갯수 초과를 arguments로 허용하지 않기 때문에 에러가 발생한다. 따라서 화살표함수는 arguments를 정의할 수 없다고 뜬다.
화살표 함수의 empty : undefined 반환
// empty 화살표 함수는 undefined를 반환 let empty = () => {};
화살표 함수의 익명함수 & 즉시호출 응용
(() => 'foobar')(); // "foobar" 반환 // (this is an Immediately Invoked Function Expression
화살표함수의 삼항연산자 응용
var simple = a => a > 15 ? 15 : a; simple(16); // 15 simple(10); // 10 . let max = (a, b) => a > b ? a : b;
화살표함수의 간결한 배열 filtering & mapping
// Easy array filtering, mapping, ... var arr = [5, 6, 13, 0, 1, 18, 23]; var sum = arr.reduce((a, b) => a + b); // 66 . var even = arr.filter(v => v % 2 == 0); // [6, 0, 18] . var double = arr.map(v => v * 2); // [10, 12, 26, 0, 2, 36, 46]
화살표 함수의 간결한 promise 체인 응용
promise.then(a => { // ... }).then(b => { // ... });
매개변수가 없는 경우 읽기 쉬운 화살표 함수
// 매개변수가 없는 경우에도 더 읽기 쉬움 setTimeout( () => { console.log('I happen sooner'); setTimeout( () => { // deeper code console.log('I happen later'); }, 1); }, 1);
ref :
MDN : https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Functions/Arrow_functions
javascript-info : https://ko.javascript.info/arrow-functions-basics
CODE:H : https://hhyemi.github.io/2021/06/09/arrow.html