The module pattern is a powerful way to structure your JavaScript code. It helps you group related code, hide private data, and expose only what’s necessary. This makes your code cleaner, safer, and easier to maintain.

Why Use the Module Pattern?

  • To avoid polluting the global namespace
  • To create private variables and functions
  • To organize code into logical units

Basic Syntax

The module pattern uses an Immediately Invoked Function Expression (IIFE) to create a private scope:

const CounterModule = (function () {
  let count = 0;

  function increment() {
    count++;
  }

  function getCount() {
    return count;
  }

  return {
    increment,
    getCount
  };
})();

How It Works

In the example above:

  • count is private — no one outside the module can access it directly.
  • increment and getCount are public methods exposed via return.

Usage

CounterModule.increment();
CounterModule.increment();
console.log(CounterModule.getCount()); // 2

// Can't access private data
console.log(CounterModule.count); // undefined

Variants: Revealing Module Pattern

This version makes it easier to see what’s public:

const Counter = (function () {
  let count = 0;

  function inc() {
    count++;
  }

  function read() {
    return count;
  }

  return {
    increment: inc,
    getCount: read
  };
})();

When Should You Use It?

  • When you want to encapsulate related functions
  • When you need data privacy
  • When you’re not using ES6 modules but still want modular code

Limitations

  • Not ideal for large-scale applications (use ES Modules or bundlers)
  • Harder to test private functions
  • Each module creates a new closure, which can have memory implications

Conclusion

The module pattern is a smart way to write organized, encapsulated JavaScript. It’s especially useful in environments where modern module systems like ES6 imports/exports aren’t available. While newer tools provide better ways to manage code, the module pattern remains a handy and reliable structure for many use cases.

Post a Comment

Your email address will not be published. Required fields are marked *