function showMenu({ title = "Menu", width = 100, height = 200 }) {
alert( `${title} ${width} ${height}` );
}
showMenu(); // Menu 100 200
참고로 이렇게 함수 매개변수를 구조 분해할 땐, 모든 인수에 기본값을 할당해 주려면 빈 객체를 명시적으로 전달해야 함
showMenu({}); // 모든 인수에 기본값이 할당됩니다.
showMenu(); // 에러가 발생할 수 있습니다.
이 문제를 예방하려면 빈 객체 {}를 인수 전체의 기본값으로 만들면 된다.
function showMenu({ title = "Menu", width = 100, height = 200 } = {}) {
alert( `${title} ${width} ${height}` );
}
showMenu(); // Menu 100 200
이렇게 인수 객체의 기본값을 빈 객체 {}로 설정하면 어떤 경우든 분해할 것이 생겨서 함수에 인수를 하나도 전달하지 않아도 에러가 발생하지 않는다.
findUsersByRole('admin', true, true); //true가 어떻게 사용될지 모호하다.
findUsersByRole({
withContactInfo: true, // 모호하지 않고 읽고 이해하기가 훨씬 쉽다.
role: 'admin',
includeInactive: true,
});
참고
파라미터 객체의 속성 중 하나가 복잡한 타입 (예 : array 또는 object) 인 경우 destructuring은 얕은(shallow) 복사를 하므로 원본이 변경 될 수 있다.
= {}
를 추가함으로써 함수({})가 아닌 함수() 처럼 빈객체를 인자없이 호출해도 에러가 나지 않으며 객체의 프로퍼티가 생략되었을 시 미리 지정한 디폴트값이 들어간다.function findUsersByRole ({
role,
withContactInfo = true,
includeInactive
} = {}) {...}
function pipe(...fns) {
return param => fns.reduce(
(result, fn) => fn(result),
param
);
}
function saveUser(userInfo) { // userInfo는 객체이다.
return pipe(validate, normalize, persist)(userInfo);
//validate, normalize, persist는 RORO기법으로 객체를 받고 객체를 리턴한다.
}
위 함수는 리듀서를 사용하여 여러함수를 입력받아 하나씩 차례로 실행하고 그 리턴값을 다음 함수의 인자로 넘겨주게 된다. 그러면 결과는 아래와같게 된다.
persist( normalize( validate( userInfo ) ) );
// validate는 userInfo를 받아서 처리 후 normalize에게 반환하고 ... 반복
(function () {
console.log("IIFE");
})();
// 화살표 함수로도 사용 가능하다
(() => {
console.log("IIFE");
})();
즉시실행함수를 왜 사용할까?
1. 필요없는 전역 변수의 생성을 줄일 수 있다.
함수를 생성하면 그 함수는 전역 변수로써 남아있게 되고, 많은 변수의 생성은 전역 스코프를 오염시킬 수 있다. 즉시실행함수를 선언하면 내부 변수가 전역으로 저장되지 않기 때문에 전역 스코프의 오염을 줄일 수 있다.
2. Private한 변수를 만들 수 있다.
즉시실행함수는 외부에서 접근 할 수 없는 자체적인 스코프를 가지게된다. 이는 클로저의 사용 목적과도 비슷하며 내부 변수를 외부로부터 private하게 보호 할 수 있다는 장점이 있다.
참고포스트
자바스크립트 디자인 패턴: RORO 🔽
https://taegon.kim/archives/8058
모던 자바스크립트의 엘레강스한 패턴 - RORO 🔽
https://usecode.pw/elegant-patterns-in-modern-java-script-roro/
JavaScript - 즉시실행함수(IIFE) 🔽
https://jongminfire.dev/java-script-%EC%A6%89%EC%8B%9C%EC%8B%A4%ED%96%89%ED%95%A8%EC%88%98-iife