6단원 '함수'의 일곱 레슨에서 9문제를 내고, 1~5단원에서 3문제를 섞었습니다. 앞 단원 문제가 어느 레슨인지는 정답을 펼치면 보입니다. 출력을 쓰는 문제는 빈칸과 줄바꿈까지 종이에 끝까지 쓴 뒤 정답을 펼치세요. 줄 수를 알려 주지 않는 문제는 마지막 줄까지 다 씁니다. 함수를 부르는 코드는 칸마다 이름이 어느 값에 붙는지 그리며 따라가면 덜 틀립니다. 막히면 정답 앞의 힌트를 먼저 펼칩니다. 점수는 매기지 않습니다.
한 번에 다 풀 필요는 없습니다. 문제 1~10은 폰으로도 풀 수 있고(약 30~40분), 끝의 만들어 보기 둘은 컴퓨터에서 Node로 직접 돌려 봅니다. 이 단원을 건너뛰어도 되는지 보려면 문제 1 · 2 · 4 · 6 · 8 · 9 여섯을 먼저 풀어 보세요(약 15분). 건너뛸지 볼 때는 힌트를 펴지 않고 풉니다. 힌트를 펴고 맞힌 문제나 짐작으로 고른 문제는 틀린 것으로 치고 그 레슨을 봅니다. 모두 맞으면 이 단원 레슨은 건너뛰고, 틀린 문제가 있으면 그 정답 끝의 레슨만 봅니다. 파이썬을 배웠다면 파이썬과 달라지는 곳이 이 여섯에 들어 있습니다(정답의 '파이썬에서는' 줄). 끝의 만들어 보기 둘은 골라서 풉니다.
끝의 두 문제는 프로그램을 직접 만들어 봅니다. 컴퓨터가 있으면 저장해 돌려 맞춰 보고, 폰으로만 본다면 문제에 적힌 값으로 내 코드를 한 줄씩 따라가 나와야 할 화면과 맞춰 봅니다. 실행 결과는 모두 Node 26으로 돌린 것입니다.
문제 1
값을 세 배로 계산하는 두 함수입니다. 무엇이 찍힐까요? 두 줄을 글자 그대로 쓰세요.
function triple(n) {
return n * 3;
}
function show(n) {
console.log(n * 3);
}
const a = triple(4);
const b = show(4);
console.log(a, b);
힌트
8번 줄의 triple(4)와 9번 줄의 show(4)가 각각 부른 자리에 어떤 값을 돌려주는지 비교해 보세요.
정답
12
12 undefined- 8번 줄:
triple(4)를 부르면 새 칸에서 n이 4에 붙고, 2번 줄의return이 12를 부른 자리에 돌려줍니다. 화면에는 아무것도 찍지 않고 a가 12에 붙습니다. - 9번 줄:
show(4)를 부르면 5번 줄의console.log가 화면에12를 먼저 찍습니다.show에는return이 없어undefined를 돌려주고, b는undefined에 붙습니다. - 10번 줄: a의 값 12와 b의 값
undefined를 빈칸 하나로 이어 찍습니다.
흔한 오답은 둘째 줄을 12 12로 쓰는 것입니다. 함수 안에서 console.log로 찍은 12가 부른 자리로도 돌아온다고 본 것입니다(찍는 것과 돌려주는 것이 같다는 생각). console.log는 화면에 쓰기만 하고, 값을 부른 자리로 돌려주는 것은 return입니다(규칙 5).
다시 볼 레슨: 함수 만들고 부르기 · 돌려받은 값 쓰기
문제 2
걷기 점수에 보너스 점수를 더하는 함수입니다. 무엇이 찍힐까요? 두 줄을 글자 그대로 쓰세요.
function score(walk, bonus) {
return walk + bonus;
}
console.log(score(30, 5, 100));
console.log(score(30));
힌트
5번 줄과 6번 줄에서 함수를 부를 때, 새 칸의 매개변수 walk와 bonus가 각각 어떤 값에 붙는지 적어 보세요.
정답
35
NaN- 5번 줄: 인자 세 개 가운데 앞의 두 개 30과 5에만 walk와 bonus가 차례대로 붙고, 남는 인자 100은 버려집니다.
30 + 5를 계산한 35를 돌려줍니다. - 6번 줄: 인자를 하나만 넘겨 walk는 30에 붙고, 짝이 없는 bonus는 오류 없이
undefined에 붙습니다. 수 30에undefined를 더하면NaN이 됩니다.
흔한 오답은 두 줄에서 TypeError로 멈춘다고 쓰거나, 첫 줄을 135 · 둘째 줄을 30으로 쓰는 것입니다. 인자 개수가 매개변수와 다르면 오류가 난다고 본 것이거나(없으면 오류라는 생각), 남는 인자까지 저절로 더해진다고 본 것입니다(규칙 5·6).
파이썬에서는 인자 개수가 매개변수와 다르면 TypeError로 멈춥니다 — 자바스크립트는 남는 인자를 버리고, 모자란 매개변수는 undefined에 붙여 수 계산에서 NaN이 됩니다.
다시 볼 레슨: 매개변수와 인자
문제 3
읽을 책의 절반 쪽수를 구하는 함수입니다. 무엇이 찍힐까요? 한 줄을 글자 그대로 쓰세요.
function half(pages) {
return pages / 2;
}
let book = 60;
const goal = half(book);
book = 100;
console.log(book, goal);
힌트
6번 줄이 실행되는 그때 book이 어느 값에 붙어 있는지 보세요.
정답
100 30- 6번 줄: 그때 book이 60이라
half(60)을 부릅니다. 새 칸에서 pages가 60에 붙고, 함수가 돌려준 30에 이름 goal을 붙입니다. - 7번 줄: book만 100에 다시 붙습니다. goal은 30에 그대로 붙어 있고, half를 다시 부르지 않습니다.
흔한 오답은 100 50입니다. goal이 half(book)이라는 식을 저장해 두었다가 찍을 때 다시 부른다고 본 것입니다(식이 저장된다는 생각). 함수를 부르는 식도 그 줄이 실행될 때 한 번 계산되어 값 하나가 됩니다(규칙 2).
다시 볼 레슨: 변수: let으로 이름 붙이기 · 돌려받은 값 쓰기
문제 4
단골 도장 수를 다루는 코드입니다. 무엇이 찍힐까요? 마지막 줄까지 글자 그대로 쓰세요. 오류로 멈추면 찍힌 줄 다음에 오류 메시지의 …Error: 줄만 써도 됩니다.
let count = 10;
function shadow() {
let count = 2;
console.log(count);
}
function up() {
count = count + 5;
}
shadow();
up();
console.log(count);
if (count >= 15) {
let tag = '단골';
}
console.log(tag);
힌트
함수나 if의 중괄호 안에서 let으로 만든 이름인지, let 없이 바깥 이름을 찾은 것인지 가려 보세요.
힌트 둘
3번 줄의 let count는 shadow 칸에만 생기고, 7번 줄의 count는 up 칸에 없어 바깥 칸에서 찾습니다. 13번 줄의 let tag가 어느 중괄호 안에서 사는지도 봅니다.
정답
두 줄을 찍고 15번 줄에서 멈춥니다.
215main.js:15console.log(tag); ^ ReferenceError: tag is not defined at main.js:15:13- 9번 줄:
shadow()를 부르면 shadow 칸에 새 이름 count가 생겨 2에 붙고2를 찍습니다. 전역 칸의 count(10)은 그대로이고, 함수가 끝나면 shadow 칸의 count는 사라집니다. - 10·11번 줄:
up()칸에는 count가 없어 바깥(전역) 칸의 count를 찾아 15에 다시 붙입니다(규칙 7). 11번 줄이15를 찍습니다. - 12~14번 줄:
15 >= 15가 참이라 if 블록 칸에 이름 tag가 생겨 '단골'에 붙지만, 14번 줄}에서 블록이 끝나며 사라집니다(규칙 4). - 15번 줄: 전역 칸에는 tag가 없어
ReferenceError로 멈춥니다.
흔한 오답은 둘째 줄을 7이나 10으로 쓰거나, 마지막 줄에 단골을 쓰는 것입니다. 3번 줄의 let count = 2가 바깥 count를 바꿨다고 본 것이거나, 중괄호 안에서 만든 이름이 밖에서도 남는다고 본 것입니다(들여쓰기가 덩어리라는 생각).
파이썬에서는 함수 안에서 global 없이 바깥 이름에 대입할 수 없고, if 안에서 만든 이름이 밖에서도 보입니다 — 자바스크립트는 지금 칸에 없는 이름을 바깥 칸에서 찾아 바꾸며, 중괄호 안에서 let·const로 만든 이름은 그 중괄호 밖에 없습니다.
다시 볼 레슨: 블록과 함수 안의 이름
문제 5
메뉴 이름표 문자열을 돌려주는 함수와 가격 계산입니다. 무엇이 찍힐까요? 세 줄을 글자 그대로 쓰세요.
function label(item, price) {
return `${item}: {price}원`;
}
const raw = '4000';
console.log(label('커피', raw));
console.log(raw + 500);
console.log(Number(raw) + 500);
힌트
2번 줄의 백틱 문자열에서 {price} 앞에 $가 있는지 보고, 5번 줄의 raw가 글자인지 수인지 보세요.
정답
커피: {price}원
4000500
4500- 6번 줄: 백틱 문자열에서
${item}자리에만 '커피'가 들어가고,$가 빠진{price}는 글자 그대로 남아커피: {price}원을 돌려줍니다. - 7번 줄: raw가 글자
'4000'이라+가 수 500을 글자로 바꿔 이어 붙인'4000500'이 됩니다. - 8번 줄:
Number(raw)가 만든 수 4000에 500을 더해4500을 찍습니다.
흔한 오답은 첫 줄을 커피: 4000원, 둘째 줄을 4500으로 쓰는 것입니다. 백틱 안에서는 중괄호만 써도 값이 들어간다고 본 것이고, 따옴표로 감싼 '4000'도 수처럼 더해진다고 본 것입니다(문자열과 수를 가리지 않는 생각).
파이썬에서는 f-문자열이 f'{item}: {price}원'처럼 중괄호만 씁니다 — 자바스크립트 템플릿 문자열은 ${price}처럼 $까지 써야 값이 들어가고, $를 빼면 오류 없이 {price}가 그대로 찍힙니다.
다시 볼 레슨: 템플릿 문자열로 출력 꾸미기 · 글자를 수로: Number와 NaN
문제 6
음료의 기본 샷 수를 2개로 정한 함수입니다. 무엇이 찍힐까요? 세 줄을 글자 그대로 쓰세요.
function order(item, shot = 2) {
console.log(item, shot);
}
order('라테');
order('커피', 0);
order('녹차', null);
힌트
매개변수 기본값 = 2가 언제 쓰이는지 떠올려 보세요. 인자가 없거나 undefined일 때만 쓰입니다.
정답
라테 2
커피 0
녹차 null부르기마다 새 칸에서 매개변수가 붙는 값입니다.
| 줄 | item | shot | 출력 |
|---|---|---|---|
| 5 | '라테' | 2(기본값) | 라테 2 |
| 6 | '커피' | 0 | 커피 0 |
| 7 | '녹차' | null | 녹차 null |
- 5번 줄: 둘째 인자를 넘기지 않아 shot이 기본값 2에 붙습니다.
- 6번 줄: 0은 거짓 같은 값이지만
undefined가 아니라서 기본값을 쓰지 않고 0에 그대로 붙습니다. - 7번 줄:
null도undefined가 아니라서 기본값을 쓰지 않고null에 그대로 붙습니다.
흔한 오답은 둘째 줄이나 셋째 줄의 숫자를 2로 쓰는 것입니다. 0이나 null을 넘겨도 기본값 2가 쓰인다고 본 것입니다. 매개변수 기본값은 인자를 생략했거나 undefined를 넘겼을 때만 쓰입니다(규칙 5).
다시 볼 레슨: 기본값 매개변수
문제 7
설명마다 알맞은 기호나 값을 하나씩 쓰세요. 넷 다 쓴 뒤 정답을 펼치세요.
- (가) 왼쪽이
0이나''같은 거짓 같은 값이면 오른쪽 값을 돌려주는 연산자 - (나)
0이나''은 그대로 두고, 왼쪽이null이나undefined일 때만 오른쪽 기본값을 돌려주는 연산자 - (다) 함수를 부를 때 인자를 생략했거나
return없이 끝났을 때 나오는 값 - (라) 화살표 함수를
(n) => n * 2처럼 만들 때 매개변수 괄호와 몸 사이에 쓰는 기호
힌트
(가)·(나)는 기본값을 고를 때 비교했던 두 연산자이고, (다)는 소문자 영단어 값, (라)는 글자 두 개로 된 화살표 기호입니다.
정답
받는 답: (가) || · (나) ?? · (다) undefined · (라) =>
- 같은 답으로 치는 꼴: 없습니다. 기호와 철자 그대로 씁니다.
- 틀리는 꼴
??— (가)에,||— (나)에: 두 연산자가 뒤바뀐 것입니다.||연산자는0이나''도 거짓 같은 값으로 보고 오른쪽으로 넘어가 0을 지우지만,??연산자는null과undefined일 때만 오른쪽 기본값을 씁니다. - 틀리는 꼴
null·None— (다)에:null은 비어 있음을 직접 적어 넣을 때 쓰는 값이고, 파이썬의None은 자바스크립트에 없습니다. - 틀리는 꼴
->— (라)에: 자바스크립트 화살표 함수는 등호(=)로 시작하는=>기호를 씁니다.
다시 볼 레슨: 참 같은 값과 ?? · 매개변수와 인자 · 화살표 함수와 함수 값
문제 8
함수 선언과 화살표 함수를 섞어 쓴 코드입니다. 이 코드를 실행하면 어떻게 될까요? 알맞은 것을 고르세요.
console.log(double(4));
function double(n) {
return n * 2;
}
const triple = (n) => {
n * 3;
};
console.log(triple(4));
console.log(half(4));
const half = (n) => n / 2;
- ①
8과undefined를 찍은 뒤 11번 줄에서ReferenceError로 멈춘다 - ②
8과12와2를 차례로 찍고 끝난다 - ③ 아무것도 찍지 않고 1번 줄에서
ReferenceError로 멈춘다
힌트
1번 줄의 double과 11번 줄의 half가 각각 어떤 문법으로 만들어졌는지 비교하고, 7~9번 줄의 화살표 함수 몸에 중괄호가 있는지 보세요.
정답
① — 실행 결과는 이렇습니다.
8undefinedmain.js:11console.log(half(4)); ^ ReferenceError: Cannot access 'half' before initialization at main.js:11:13- 1번 줄:
function double선언은 실행 전에 미리 함수 값으로 만들어져 있어, 선언 줄보다 위에서 불러도8을 돌려줍니다. - 7~10번 줄:
triple은 화살표 뒤에 중괄호를 썼는데return이 없습니다. 중괄호 몸은 일반 함수와 같아서return이 없으면undefined를 돌려줍니다. - 11번 줄:
const half는 12번 줄에서야 값에 붙으므로, 11번 줄에서는 '아직 못 씀' 상태라ReferenceError로 멈춥니다. - ② 화살표 함수는 중괄호를 써도 저절로 값을 돌려준다고 본 것이고,
const로 만든 화살표 함수도 선언 줄 위에서 부를 수 있다고 본 것입니다. 식 하나만 돌려줄 때는(n) => n * 3처럼 중괄호 없이 쓰고, 부르는 줄은 선언 줄 아래에 둡니다. - ③
function선언도 선언 줄 아래에서만 부를 수 있다고 본 것입니다.
다시 볼 레슨: 화살표 함수와 함수 값
문제 9
넘겨받은 함수를 두 번 부르는 twice입니다. 무엇이 찍힐까요? 마지막 줄까지 글자 그대로 쓰세요. 오류로 멈추면 찍힌 줄 다음에 오류 메시지의 …Error: 줄만 써도 됩니다.
function twice(action) {
action();
action();
}
function clap() {
console.log('짝');
}
twice(clap);
twice(clap());
힌트
10번 줄의 clap과 11번 줄의 clap()이 twice에 무엇을 넘기는지 비교해 보세요.
힌트 둘
11번 줄은 괄호가 붙은 clap()을 그 자리에서 먼저 부르고, 그 함수가 돌려준 값(undefined)을 twice의 action에 넘깁니다.
정답
짝이 세 번 찍힌 뒤 2번 줄에서 멈춥니다.
짝짝짝main.js:2 action(); ^ TypeError: action is not a function at twice (main.js:2:3) at main.js:11:1- 10번 줄: 괄호 없이 이름
clap만 써서 함수 값을 그대로 넘깁니다. twice 칸의 action이 clap을 가리키고, 2번 줄과 3번 줄에서 한 번씩 불려짝을 두 줄 찍습니다. - 11번 줄: 인자 자리의
clap()에 괄호가 붙어 있어 twice에 넘어가기 전에 먼저 불립니다. 여기서 세 번째짝이 찍히고, clap에는return이 없어undefined가 twice로 넘어갑니다. - twice의 2번 줄:
undefined에 붙은 action을action()으로 부르려다 함수가 아니라서TypeError로 멈춥니다.
흔한 오답은 짝이 네 번 찍힌다고 쓰거나, 짝이 두 번만 찍히고 바로 멈춘다고 쓰는 것입니다. 함수를 넘길 때도 괄호를 붙여야 한다고 본 것이거나(넘길 때도 괄호를 붙인다는 생각), 11번 줄에서 clap()이 먼저 실행되며 찍는 세 번째 짝을 놓친 것입니다(규칙 5).
다시 볼 레슨: 함수를 넘기기 · 함수 만들고 부르기
문제 10
배달 요금은 기본요금 3000원에 1km마다 800원을 더합니다. 4km면 거리 요금 3200원에 기본요금을 더한 6200 한 줄만 찍혀야 하는데, 아래처럼 3200 다음에 NaN이 찍혔습니다. 몇 번 줄의 무엇을 고쳐야 할까요? 고친 줄을 쓰세요.
function fee(km) {
console.log(km * 800);
}
const total = fee(4) + 3000;
console.log(total);
3200
NaN힌트
5번 줄에서 fee(4) 자리에 어떤 값이 돌아와 + 3000과 계산되었길래 NaN이 되었는지 보세요.
정답
2번 줄의 console.log(km * 800);을 return km * 800;으로 고칩니다.
function fee(km) {
return km * 800;
}
const total = fee(4) + 3000;
console.log(total);6200NaN은 6번 줄에서 찍혔지만 처음 틀린 값이 생긴 곳은 2번 줄입니다. 고치기 전의 fee는 2번 줄에서 3200을 화면에 찍기만 하고 undefined를 돌려줘, 5번 줄의 식이 undefined + 3000이 되어 total이 NaN에 붙었습니다. return으로 바꾸면 fee(4) 자리에 3200이 놓여 3200 + 3000을 계산합니다(규칙 5).
- 다르게 고쳐도 되는 곳:
return 800 * km;도 같습니다.console.log를 남긴 채 그 아래에return km * 800;을 더하면NaN은 사라지지만3200이 한 줄 더 찍혀 나와야 할 화면과 다릅니다. - 흔한 오답은 5번 줄의
+ 3000을 지우는 것입니다.NaN은 사라지지만 요금 대신undefined가 찍힙니다. 화면에 3200이 보이니 그 값이 total로 돌아온다고 본 것입니다(찍는 것과 돌려주는 것이 같다는 생각).
다시 볼 레슨: 돌려받은 값 쓰기 · 함수 만들고 부르기 · 값을 찍어 보며 고치기
문제 11 (만들어 보기)
주문 금액 계산 함수를 만들어 봅니다. 함수 order는 한 잔 값과 잔 수를 차례로 받아 금액을 돌려줍니다. 네 잔 이상이면 한 잔 값에서 500원씩 깎아 줍니다. 뼈대의 마지막 줄 console.log(order(4500, 2));가 이렇게 찍어야 합니다.
9000
끝에 console.log(order(4000, 4)); 한 줄을 더해 다른 인자로 한 번 더 부르면 이렇게 나와야 합니다.
9000
14000
아래 뼈대에서 마지막 줄은 그대로 두고, 주석 셋 아래를 채우세요. 다 쓰면 둘째 시험 값으로도 따라가 봅니다.
// 1. 받을 값 정하기
// 2. 계산하기
// 3. 돌려주기
console.log(order(4500, 2));
힌트
금액은 한 잔 값 × 잔 수이고, 깎을지는 잔 수(>= 4)로 정합니다.
정답
모범 답입니다.
// 1. 받을 값 정하기
function order(price, cups) {
// 2. 계산하기
if (cups >= 4) {
price = price - 500;
}
const won = price * cups;
// 3. 돌려주기
return won;
}
console.log(order(4500, 2));9000console.log(order(4000, 4));를 더하면 새 칸에서 price가 4000에, cups가 4에 붙습니다. 4 >= 4가 참이라 price가 3500에 다시 붙고, 3500 * 4인 14000을 돌려줍니다.
- 다르게 써도 되는 곳: 금액을 먼저
let won = price * cups;로 계산한 뒤 네 잔 이상이면won = won - 500 * cups;로 빼도 됩니다. 갈래마다return을 따로 써도 되고, 화살표 함수(price, cups) => { ... }로 써도 됩니다. 매개변수 이름은 달라도 되지만 차례는 한 잔 값, 잔 수입니다. - 찍은 화면이 위와 같고 둘째 시험 값에서도
9000과14000이 나오면 맞습니다. - 흔한 오답:
return대신console.log(won);을 쓰면9000다음undefined가 한 줄 더 찍힙니다(찍는 것과 돌려주는 것이 같다는 생각).- 조건을
cups > 4로 쓰면 네 잔에서 깎지 않아 둘째 줄이16000이 됩니다. 두 잔인 처음 시험 값에서는 드러나지 않아 둘째 시험 값으로 봅니다. - 9000을 손으로 계산해
return 9000;으로 쓰면 둘째 줄도9000이 찍힙니다. 금액은 받은 매개변수로 계산합니다.
다시 볼 레슨: 함수 만들고 부르기 · 매개변수와 인자 · 돌려받은 값 쓰기
문제 12 (만들어 보기)
이번에는 빈 데서 씁니다. 단원의 작은 완성품인 주문 금액 계산 함수 셋(가격 · 할인 · 영수증 줄)을 완성해 봅니다. 아래 칸의 1~9번 줄에는 잔 수를 받아 금액(4000 * n)을 돌려주는 price와, 10000원 이상이면 1000원을 깎아 돌려주는 sale이 있습니다. 그 아래에 영수증 문장을 만들어 돌려주는 함수 bill을 쓰고, '커피'(잔 수 생략 — 기본값 1잔)와 '커피' 3잔의 영수증 줄을 차례로 찍으세요. 이렇게 나와야 합니다.
커피 4000원
커피 11000원
마지막 줄의 잔 수만 2로 바꾸면(8000원이라 할인 없음) 이렇게 나와야 합니다.
커피 4000원
커피 8000원
아래 칸의 1~9번 줄은 그대로 두고, 그 아래를 씁니다.
function price(n) {
return 4000 * n;
}
function sale(won) {
if (won >= 10000) {
return won - 1000;
}
return won;
}
힌트
하위 목표 셋으로 나눠 씁니다 — 1. 받을 값 정하기(item과 기본값이 1인 잔 수 매개변수) · 2. price와 sale을 차례로 불러 결제 금액 구하기 · 3. 템플릿 문자열로 영수증 문장을 만들어 돌려주고, 두 주문을 찍기.
정답
모범 답입니다.
function price(n) {
return 4000 * n;
}
function sale(won) {
if (won >= 10000) {
return won - 1000;
}
return won;
}
function bill(item, n = 1) {
const won = sale(price(n));
return `${item} ${won}원`;
}
console.log(bill('커피'));
console.log(bill('커피', 3));커피 4000원
커피 11000원bill('커피')는 둘째 인자를 생략해 n이 기본값 1에 붙고, price(1)인 4000을 sale(4000)에 넘겨 4000을 돌려받습니다. bill('커피', 3)은 price(3)인 12000을 sale(12000)에 넘겨 1000원 할인된 11000을 돌려받습니다. 잔 수를 2로 바꾸면 8000원이라 할인이 적용되지 않고 커피 8000원이 찍힙니다.
- 다르게 써도 되는 곳:
let won = price(n);다음 줄에won = sale(won);처럼 두 줄로 나눠 써도 되고,bill을 화살표 함수로 써도 됩니다. 매개변수 이름은qty = 1·cups = 1처럼 달라도 됩니다. - 찍은 화면이 위와 같고 둘째 시험 값에서도
커피 4000원과커피 8000원이 나오면 맞습니다. - 흔한 오답:
- 잔 수 매개변수에 기본값
= 1을 빠뜨리면 첫 줄이커피 NaN원으로 찍힙니다(모자란 인자는undefined). sale(won)이 돌려준 값을 쓰지 않고sale(won);만 쓰면 할인된 값이 버려져 3잔이커피 12000원으로 찍힙니다.bill안에서return대신console.log를 쓰고 밖에서도console.log(bill(...))로 찍으면 줄마다undefined가 더 찍힙니다.
- 잔 수 매개변수에 기본값
다시 볼 레슨: 돌려받은 값 쓰기 · 기본값 매개변수 · 함수 만들고 부르기
틀린 문제는 그 레슨으로 돌아가 모션 그림과 '자주 틀리는 곳'을 보고, 하루쯤 지난 뒤 그 문제만 다시 풀어 보세요. 그날 바로 다시 풀면 방금 본 정답이 기억나 맞힌 것인지 알기 어렵습니다.