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 done already 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.