JS LAB
JS 2.2 · 2부. 함수와 스코프

함수 표현식과 화살표 함수

함수를 작성하는 세 가지 방법과 그 차이를 봅니다.

예상 학습 시간 14분 실행 단추가 있는 예제는 고쳐서 실행해 볼 수 있습니다 난이도 입문
개념 설명

함수를 만드는 세 가지 방법

앞 단원에서 사용한 function 이름() {}함수 선언문 입니다. 이것 말고 두 가지가 더 있습니다.

  • 함수 선언문function greet() {}
  • 함수 표현식 — 함수를 값처럼 변수에 담습니다.
  • 화살표 함수 — 표현식을 더 짧게 적는 방법입니다.

셋 다 하는 일은 같습니다. 요즘 코드에서는 화살표 함수를 가장 많이 봅니다.

최소 예제 · 편집 가능

같은 함수를 세 가지로

script.js
function add1(a, b) {
	return a + b;
}

const add2 = function (a, b) {
	return a + b;
};

const add3 = (a, b) => a + b;

console.log(add1(1, 2), add2(1, 2), add3(1, 2));
출력
3 3 3

표현식과 화살표 함수는 값을 변수에 담는 문장이라 끝에 세미콜론이 붙습니다. 선언문에는 붙이지 않습니다.

상세 사용법

화살표 함수를 줄여 적기

화살표 함수는 모양에 따라 더 줄일 수 있습니다. 중괄호를 빼면 그 식의 결과를 그대로 돌려줍니다return 을 적지 않습니다.

script.js
const double = n => n * 2;
const greet = () => "안녕하세요";
const sum = (a, b) => {
	const total = a + b;
	return total;
};

console.log(double(5));
console.log(greet());
console.log(sum(3, 4));
출력
10 안녕하세요 7
  • 매개 변수가 하나면 괄호를 빼도 됩니다 — n => n * 2
  • 매개 변수가 없거나 둘 이상이면 괄호가 필요합니다 — () =>, (a, b) =>
  • 중괄호를 쓰면 return 을 적어야 합니다
상세 사용법

선언문만 미리 부를 수 있습니다

함수 선언문은 아래에 적어도 위에서 부를 수 있습니다. 표현식과 화살표 함수는 그럴 수 없습니다. 변수에 담기 전에는 아직 값이 없기 때문입니다.

script.js
console.log(declared());

function declared() {
	return "선언문은 먼저 부를 수 있습니다";
}
출력
선언문은 먼저 부를 수 있습니다
script.js
console.log(assigned());

const assigned = () => "화살표 함수입니다";
출력 · 크롬
ReferenceError: Cannot access 'assigned' before initialization
출력 · 파이어폭스
ReferenceError: can't access lexical declaration 'assigned' before initialization

왜 그런지는 다음다음 단원(2.4)에서 다룹니다. 지금은 함수를 위에 두고 아래에서 부르는 차례로 적으면 어느 방법이든 문제가 없습니다.

상세 사용법

무엇을 선택할까

  • 화살표 함수 — 짧은 함수, 그리고 다른 함수에 넘길 함수(2.6)
  • 함수 선언문 — 이름이 뚜렷해야 하는 함수. 오류 메시지에도 이름이 나옵니다
  • 함수 표현식 — 요즘은 화살표 함수로 대체되어 새로 작성할 일이 적습니다

화살표 함수에는 한 가지 차이가 더 있는데, this 를 다루는 방식입니다. 6.3 에서 다룹니다.

흔한 실수

처음에 자주 걸리는 것

1. 중괄호를 쓰고 return 을 빠뜨립니다

중괄호를 열면 그 안은 보통의 함수 본문입니다. return 이 없으면 undefined 를 돌려줍니다.

const add = (a, b) => { a + b; };   // undefined 를 돌려줍니다
const add = (a, b) => a + b;        // 이렇게 적습니다
2. 세미콜론을 빠뜨립니다

화살표 함수와 표현식은 변수에 담는 문장이라 끝에 세미콜론이 붙습니다. 다음 줄이 괄호로 시작하면 두 줄이 하나로 읽혀 이상한 오류가 납니다.

3. 선언하기 전에 부릅니다

화살표 함수는 변수에 담기기 전에 부를 수 없습니다.

ReferenceError: Cannot access 'assigned' before initialization
실습 문제

직접 해보기

1. 화살표 함수로 바꾸기 난이도 하

아래 함수를 화살표 함수로 가장 짧게 바꿔 보세요.

function half(n) { return n / 2; }
const half = n => n / 2; console.log(half(10)); // 5
2. 세 함수를 화살표로 만들기 난이도 중

아래 셋을 화살표 함수로 만들고 각각 한 번씩 불러 출력하세요.

  • 이름을 받아 "홍길동님" 처럼 돌려주는 함수
  • 두 수를 받아 큰 쪽을 돌려주는 함수
  • 매개 변수 없이 "준비됐습니다" 를 돌려주는 함수
큰 쪽을 고르는 것은 값 하나를 고르는 자리이므로 삼항 연산자가 맞습니다.
const honorific = name => `${name}님`; const bigger = (a, b) => a > b ? a : b; const ready = () => "준비됐습니다"; console.log(honorific("홍길동")); console.log(bigger(3, 7)); console.log(ready());
요약

이 단원의 정리

  • 함수를 만드는 방법은 선언문 · 표현식 · 화살표 함수 셋입니다.
  • 화살표 함수는 중괄호를 빼면 그 식의 결과를 그대로 돌려줍니다.
  • 매개 변수가 하나면 괄호를 뺄 수 있습니다.
  • 선언문만 아래에 적어도 위에서 부를 수 있습니다.
  • 표현식과 화살표 함수는 변수에 담는 문장이라 세미콜론이 붙습니다.