Before ES modules, developers used IIFEs (Immediately Invoked Function Expressions) to create private scope. The module pattern returns a public API while keeping implementation private: const counter = (() => { let count = 0; return { increment() { count++; }, get() { return count; } }; })();