DEV Community

Samarth Goudar
Samarth Goudar

Posted on • Edited on

Javascript : Functions, Chaining, Equality and Closures

Image descriptionJavaScript offers powerful features like higher order functions, method chaining, strict equality, and closures. Understanding these core concepts helps write cleaner, more efficient code. In this blog, we’ll break down each topic with simple explanations and examples.

Functions

In JavaScript, it’s common to see functions returning other functions or objects. When a function returns another function, it’s known as a higher-order function. These are powerful tools in functional programming, enabling dynamic behavior and function composition. Similarly, factory functions return new object instances and are often used as alternatives to classes, especially when object creation logic needs to be encapsulated

function multiplier(factor) {
  return function(number) {
    return number * factor;
  };
}

const double = multiplier(2);
console.log(double(5)); // 10
Enter fullscreen mode Exit fullscreen mode

Here, multiplier returns a new function that remembers the factor passed in. Now compare that with a factory function:

function createUser(name, age) {
  return {
    name,
    age,
    greet() {
      console.log(`Hi, I'm ${name}`);
    }
  };
}

const user = createUser('Sam', 25);
user.greet(); // Hi, I'm Sam
Enter fullscreen mode Exit fullscreen mode

In this case, createUser returns a new object with data and behavior. These patterns are especially useful for creating reusable and modular code.

Chaining

Another important concept is method chaining. This is a design pattern where multiple methods are called in a single line, one after another. It’s commonly seen in libraries like jQuery or Lodash, and it relies on each method returning the object itself (or a new object). This pattern improves readability and reduces boilerplate code when performing sequential operations.

class Calculator {
  constructor(value = 0) {
    this.value = value;
  }

  add(n) {
    this.value += n;
    return this;
  }

  subtract(n) {
    this.value -= n;
    return this;
  }

  multiply(n) {
    this.value *= n;
    return this;
  }

  result() {
    return this.value;
  }
}

const calc = new Calculator();
const final = calc.add(5).multiply(2).subtract(3).result();
console.log(final); // 7
Enter fullscreen mode Exit fullscreen mode

Each method returns the object, enabling us to chain them smoothly and keep the code concise.

Equality

A commonly misunderstood part of JavaScript is the difference between the equality operators == and ===. The == operator is known as the abstract equality operator and allows type coercion, meaning it will attempt to convert operands to the same type before comparing. The === operator is the strict equality operator and does not perform any conversion, both the type and value must match for it to return true.

console.log(5 == '5');  // true  (because of coercion)
console.log(5 === '5'); // false (different types)
Enter fullscreen mode Exit fullscreen mode

To avoid unexpected results, it’s recommended to always use === for comparisons.

Closures

Closures are one of the most powerful and important features in JavaScript. At a basic level, a closure is formed when a function remembers the variables from its lexical scope, even after that outer function has finished executing. This allows inner functions to access variables from their outer functions long after those outer functions have returned.

function outerFunction() {
  let outerVariable = "I'm outside!";

  function innerFunction() {
    console.log(outerVariable);
  }

  return innerFunction;
}

const closureFunc = outerFunction();
closureFunc(); // Output: I'm outside!
Enter fullscreen mode Exit fullscreen mode

In this code, innerFunction is returned from outerFunction, and later invoked as closureFunc(). Even though outerFunction has already finished executing, innerFunction still has access to outerVariable.

Note: Closures keep references to their outer variables, which can prevent those variables from being garbage collected. While this is usually fine, excessive or long-lived closures may lead to memory leaks if not managed properly.

Top comments (0)