
코어자바스크립트 ch5. 클로저를 읽고 정리한 내용입니다.
메모리 소모는 클로저의 본질적인 특성이다. 의도대로 설계한 ‘메모리 소모’에 대한 관리법만 잘 파악해서 적용하는 것으로 충분하다. (p.123)
| setup | cleanup |
|---|---|
| setInterval() | clearInterval() |
| animation.start() | anumation.reset() |
function createLogger(msg) {
let count = 0;
return function() {
count++;
console.log(`${msg} ${count}`);
};
}
let logger = createLogger("로그 메시지:");
// 이벤트 리스너에서 클로저 사용
document.getElementById("myButton").addEventListener("click", logger);
createLooger 함수는 클로저를 반환하며, 이때 내부 함수는 외부 변수를 참조한다.// 커링 함수를 이용한 HOC 선언
function withLoading(WrappedComponent) {
return function({ isLoading, ...rest }) {
if (isLoading) {
return <div>Loading...</div>;
} else {
return <WrappedComponent {...rest} />;
}
};
}
// 예시 컴포넌트 선언
function MyComponent({ data }) {
return (
<div>
<h1>My Component</h1>
<p>{data}</p>
</div>
);
}
// 사용 예시
const MyComponentWithLoading = withLoading(MyComponent);
function App() {
// 데이터를 가져오는 상태 시뮬레이션
const [loading, setLoading] = useState(true);
const [data, setData] = useState(null);
// ...
return (
<MyComponentWithLoading isLoading={loading} data={data} />
);
}const handleChange = (fieldName: string) => (
e: React.ChangeEvent<
HTMLInputElement | HTMLTextAreaElement
>
) => {
setValues({
...values,
[fieldName]: e.currentTarget.value,
});
};
return (
<form onSubmit={handleSubmit}>
<input
type="text"
placeholder="Enter your name"
value={values.name}
**onChange={handleChange("name")}**
/>
<button type="submit">Save</button>
</form>
);onChange={()=>handleChange("name")} 형태인 익명함수를 전달해야 한다. 하지만 커링을 사용해서 더 간단하게 작성할 수 있다.