화살표 함수는 function을 =>
로 대체한 함수 표현이다.
//기존 함수 표현식으로 표현한 함수
const foo = function(bar) {
return `${bar}!`
};
//화살표 함수로 위의 함수를 다시 표현하면
const foo = bar => `${bar}!`;
간결한 표현을 통해 가독성이 높아지고 코드도 축약되는 장점을 가지고 있다. 또한 좀더 시멘틱한 표현이라 볼 수 있다. 예제의 표현을 있는 그대로 해석하면 'foo 는 bar를 ${bar}!
로 만드는 것(함수)'라고 볼 수 있다. 인풋 과 아웃풋 사이에 어떤 명령을 수행하는 것을 화살표를 통해 직관적으로 표현하였다.
기존의 함수가 가지고 있던 dynamic this(자신을 호출하는 객체를 가리키는 this)가 아닌 lexical this(코드의 상위 스코프의 this)를 가지고 있다. 이 때문에 화살표 함수는 다음과 같은 상황에서 주의하여 사용하여야 한다.
const foo = () => {bar: 1}; //오류 발생 foo() 호출은 undefined를 반환
const foo = () => ({bar: 1}); //foo() 호출은 {bar: 1}을 반환
화살표 함수의 특징적인 표현 때문에 함수가 객체 리터럴을 반환 하게 할때는 주의하여야 한다. 일반적으로 객체로 표현하면 화살표 함수의 block바디를 의미하기 때문이다. 객체 리터럴을 반환 할때는 ()로 감싸 주어야 한다.
문자열(String)을 좀 더 편하게 작성할 수 있게 도와주며 '내장된 표현식'을 허용하는 문자열을 의미한다.
템플릿 태그는 tag함수(함수의 이름은 무엇이든 될 수 있다.)를 이용하여 templete literals 내의 문자열과 표현식을 변경할 수 있다.
//함수를 선언, 함수 이름은 한정되어 있지 않다.
const tag = (strings, ...values) => {
console.log(strings);
console.log(values);
return `bazzinga!`
};
//함수의 실행을 ()이 아니라 템플릿 리터럴로 한다.
tag`hello world! in ${2000 + 21} year`;
//console에 길이 2 배열이 표시된다. ["hello world! in ", " year", raw: Array(2)]
//console에 길이 1 배열이 표시된다. [2021]
//'bazzinga!'가 리턴된다.
1 var person = 'Mike';
2 var age = 28;
3
4 function myTag(strings, personExp, ageExp) {
5
6 var str0 = strings[0]; // "that "
7 var str1 = strings[1]; // " is a "
8
9 // 사실 이 예제의 string에서 표현식이 두 개 삽입되었으므로
10 // ${age} 뒤에는 ''인 string이 존재하여
11 // 기술적으로 strings 배열의 크기는 3이 됩니다.
12 // 하지만 빈 string이므로 무시하겠습니다.
13 // var str2 = strings[2];
14
15 var ageStr;
16 if (ageExp > 99){
17 ageStr = 'centenarian';
18 } else {
19 ageStr = 'youngster';
20 }
21
22 // 심지어 이 함수내에서도 template literal을 반환할 수 있습니다.
23 return str0 + personExp + str1 + ageStr;
24
25 }
26
27 var output = myTag`that ${ person } is a ${ age }`;
28
29 console.log(output);
30 // that Mike is a youngster
that
)is a
)