Exercise 4: Once (run only once)
Problem Statement
Create a function once(fn) that executes fn only the first time, then returns the same result.
Sample Output:
const onceFn = once(() => console.log("init"));
onceFn(); onceFn(); onceFn();
// Output: "init" (only once)Solution
const once = (fn) => {
let done = false, val;
return (...args) => {
if (!done) { val = fn(...args); done = true; }
return val;
};
};Explanation
Overall Goal:
- Function ko sirf ek baar execute karna, baad me same result return karna.
- Initialization functions ke liye perfect (analytics, config setup).
Line 1: Function header
const once = (fn) => {→ higher-order function.
Line 2: State variables
let done = false, val;done→ flag: kya function already execute ho chuka hai?val→ cached result store karne ke liye.
Line 3: Return wrapper function
return (...args) => {→ function return karta hai jo original function ko wrap karta hai.
Line 4: Check and execute
if (!done) { val = fn(...args); done = true; }!done→ agar pehle execute nahi hua:val = fn(...args)→ function execute karke result store.done = true→ flag set karo (ab execute ho chuka hai).- Agar
donealready true hai → if block skip, cached value use hoga.
Line 5: Return cached value
return val;→ cached value return (pehli baar computed, baad me same).
Example:
- First call:
onceFn()→ execute → store → return result. - Second call:
onceFn()→ skip execution → return cached result.
Real world:
- Analytics initialization: Google Analytics, Mixpanel setup.
- Config loading: environment variables load karna.
- Event listeners: ek baar hi attach karna.