JS에서 함수는 값이다 — 변수에 담고, 인자로 넘기고, 리턴할 수 있다. 이 사실 하나가 이후 모든 것(콜백, Promise, 배열 메서드)의 기반이다.
function add(a, b) {
return a + b;
}
const add2 = (a, b) => a + b; // 표현식 하나면 중괄호/return 생략 가능
const square = (n) => n * n;
const greet = () => console.log("hi"); // 인자 없어도 괄호는 필요
// 블록이 필요하면 화살표 함수도 중괄호+return
const classify = (temp) => {
if (temp >= 80) return "위험";
return temp >= 65 ? "경고" : "정상";
};
this가 없다(바깥 스코프의 this를 그대로 씀). 객체 메서드로 쓸 땐 선언식/축약 메서드 문법을 쓰는 게 안전하다 — Day 12 클래스에서 다시 나온다.
function retry(fn, times = 3) { // 기본값
// ...
}
function sum(...nums) { // rest — 나머지를 배열로 모음
return nums.reduce((a, b) => a + b, 0);
}
sum(1, 2, 3) // 6
sum() // 0
함수를 다른 함수의 인자로 넘기는 패턴. Rust의 클로저를 함수 인자로 넘기는 것과 개념은 똑같다.
function withRetry(fn, times) {
for (let i = 0; i < times; i++) {
try {
return fn(); // 성공하면 바로 리턴
} catch (e) {
if (i === times - 1) throw e; // 마지막 시도까지 실패하면 에러 전파
}
}
}
withRetry(() => JSON.parse(rawInput), 3);
function makeCounter() {
let count = 0; // 이 변수는 바깥에서 직접 접근 불가
return () => ++count; // 리턴된 함수가 count를 "기억"함
}
const counter = makeCounter();
counter() // 1
counter() // 2
_submissions/day03.js과제 1. 가동시간 포맷터
function formatUptime(seconds) {
// TODO: 초 단위를 "N일 N시간" 형태 문자열로 변환
// 1일 미만이면 "N시간"만, 1시간 미만이면 "N분"만 표시
}
// formatUptime(276543) → "3일 4시간"
// formatUptime(7200) → "2시간"
// formatUptime(180) → "3분"
과제 2. clamp
function clamp(n, min, max) {
// TODO: n이 min~max 범위를 벗어나면 경계값으로 잘라서 리턴
}
// clamp(120, 0, 100) → 100
// clamp(-5, 0, 100) → 0
// clamp(50, 0, 100) → 50
과제 3. 재시도 유틸
Day 3의 예제를 참고해 retry(fn, times = 3)을 직접 구현한다 (기본값 파라미터 사용). fn이 계속 실패하면 마지막 에러를 던져야 한다.
과제 4 (도전). 카운터 팩토리
makeCounter(start = 0)를 작성한다. 호출할 때마다 { next, reset } 객체를 리턴하는데, next()는 호출할 때마다 1씩 증가한 값을, reset()은 start 값으로 되돌리는 함수여야 한다. (클로저 응용)
cd ~/Documents/javascript-2주완성
bun _grade.ts day03