DEV Community

Elizabeth Sobiya
Elizabeth Sobiya

Posted on

Unraveling Currying in JavaScript: A Beginner's Guide with Real-World Examples

Hey there, fellow devs! Today, we're diving into a fascinating and powerful concept in JavaScript called currying. If you've ever wondered how to make your functions more flexible and reusable, this post is for you. We'll break down what currying is, why it's useful, and how to implement it with easy-to-follow examples. Let's get started! 🚀

What is Currying?

Currying is a functional programming technique that transforms a function with multiple arguments into a sequence of functions, each taking a single argument. In simpler terms, it means breaking down a function that takes several arguments into a series of functions that each take one argument and return another function.

Why Use Currying?

  1. Reusability: Currying allows you to create reusable, more specific functions from general functions.
  2. Readability: Curried functions can make your code more readable and expressive.
  3. Partial Application: Currying makes it easy to fix some arguments of a function and generate a new function.

Currying in Action

Let's start with a simple example to illustrate currying in JavaScript.

Example 1: Basic Currying with Volume Calculation

Suppose we have a function that calculates the volume of a box given its length, width, and height:

function calculateVolume(length, width, height) {
  return length * width * height;
}

console.log(calculateVolume(3, 4, 5)); // Output: 60
Enter fullscreen mode Exit fullscreen mode

Now, let's transform this function into a curried version:

function curriedVolume(length) {
  return function (width) {
    return function (height) {
      return length * width * height;
    };
  };
}

// Usage
const volumeWithLength3 = curriedVolume(3);
const volumeWithLength3AndWidth4 = volumeWithLength3(4);
console.log(volumeWithLength3AndWidth4(5)); // Output: 60
Enter fullscreen mode Exit fullscreen mode

In this example, curriedVolume is a function that takes length and returns another function that takes width, which in turn returns another function that takes height and finally returns the volume.

Example 2: Real-World Example with Logger Function

Let's consider a logging function that logs messages with different log levels and timestamps:

function logMessage(timestamp, level, message) {
  console.log(`[${timestamp}] [${level}]: ${message}`);
}

// Usage
logMessage(new Date(), 'INFO', 'User logged in successfully.');
Enter fullscreen mode Exit fullscreen mode

Now, let's curry this function to create more specific logging functions:

function curriedLog(timestamp) {
  return function (level) {
    return function (message) {
      console.log(`[${timestamp}] [${level}]: ${message}`);
    };
  };
}

// Usage
const logToday = curriedLog(new Date());
const logInfoToday = logToday('INFO');
logInfoToday('User logged in successfully.');
Enter fullscreen mode Exit fullscreen mode

With currying, we created specific logging functions for different log levels, enhancing code reusability and readability.

Conclusion

Currying is a powerful technique in functional programming that can make your JavaScript code more modular, reusable, and expressive. By transforming functions to accept arguments one at a time, you open up new possibilities for partial application and function composition.

Give currying a try in your next project and see how it can simplify your codebase. Happy coding! 🎉

Feel free to leave your thoughts, questions, or examples of currying in the comments below. Let's learn together!

Top comments (4)

Collapse
 
tracygjg profile image
Tracy Gilmore

Hi Elizabeth, I seldom use currying but I have found partial application very useful. An example use case I encounter a lot is to generalise the definition of an event handler function so it can be specialised at the time of calling.
Here is a trivial example.

function changePage(pageDelta) {
  return function _changePage() {
    pageIndex += pageDelta;
  };
}

domPrevButton.addEventListener('click', changePage(-1));
domNextButton.addEventListener('click', changePage(1));
Enter fullscreen mode Exit fullscreen mode

Although not strictly necessary, I would still name the inner function as this helps debugging the call stack.
Best regards.

Collapse
 
elizabethsobiya profile image
Elizabeth Sobiya

Thank you so much for sharing your insights and the example! I really appreciate you taking the time to explain how you use partial application, and your example with event handlers is very clear and helpful.

Collapse
 
vjnvisakh profile image
Visakh Vijayan

never came across a need to use this. but it was good to know a new concept

Collapse
 
elizabethsobiya profile image
Elizabeth Sobiya

Thank you for your feedback! I'm glad you found the concept interesting.