Higher-Order Functions in JavaScript

Emma Delaney
3 min readOct 25, 2024

--

What Are Higher-Order Functions?

Imagine you have a magical box. This box can do two amazing things. It can take a toy and change it. It can also take another box inside it! In JavaScript, higher-order functions are like that magical box. They can take other functions as inputs or give you a new function as a result.

Why Use Higher-Order Functions?

Higher-order functions help make our code cleaner and more fun to read. They let us do cool things with functions. This helps us write better programs. Let’s explore how they work!

Functions as First-Class Citizens

In JavaScript, functions are special. They are treated like any other value. You can assign them to a variable, pass them to another function, or even return them from a function. This is why we can have higher-order functions!

Example 1: Passing Functions as Arguments

Let’s start with a simple example. Imagine we have a function that greets someone. Here’s how it looks:

function greet(name) {
return "Hello, " + name + "!";
}

Now, we can create another function that uses this greeting function:

function greetFriend(greetFunction, friendName) {
return greetFunction(friendName);
}

In this case, greetFriend takes two things: a function (greetFunction) and a name (friendName). We can use it like this:

console.log(greetFriend(greet, "Alice")); // Hello, Alice!

Here, greetFriend uses the greet function to greet Alice. Isn’t that cool?

Example 2: Returning Functions

Now, let’s look at another fun example. What if we want to create a function that gives us a greeting function based on the time of day? We can do this too!

function getGreeting(timeOfDay) {
if (timeOfDay === "morning") {
return function(name) {
return "Good morning, " + name + "!";
};
} else {
return function(name) {
return "Good evening, " + name + "!";
};
}
}

Now we can use getGreeting to create different greeting functions:

const morningGreeting = getGreeting("morning");
console.log(morningGreeting("Bob")); // Good morning, Bob!

const eveningGreeting = getGreeting("evening");
console.log(eveningGreeting("Sarah")); // Good evening, Sarah!

We used getGreeting to create two different functions. One for morning and one for evening!

More Fun with Higher-Order Functions

Now that we know the basics, let’s explore more ways to use higher-order functions.

Array Methods

JavaScript has many built-in functions that are higher-order functions. They work great with arrays. Let’s look at a few!

The map Function

The map function helps us change every item in an array. For example:

const numbers = [1, 2, 3, 4];
const doubled = numbers.map(function(num) {
return num * 2;
});
console.log(doubled); // [2, 4, 6, 8]

Here, map takes a function that doubles each number. It gives us a new array with the doubled numbers!

The filter Function

The filter function helps us pick certain items from an array. For example:

const ages = [12, 18, 20, 16, 14];
const adults = ages.filter(function(age) {
return age >= 18;
});
console.log(adults); // [18, 20]

In this example, reduce adds all the numbers together. We start with a total of 0 and get the final sum!

Creating Our Own Higher-Order Functions

You can create your own higher-order functions too! Let’s create a function that repeats another function a certain number of times:

function repeatFunction(func, times) {
for (let i = 0; i < times; i++) {
func();
}
}

Now we can use it:

function sayHello() {
console.log("Hello!");
}

repeatFunction(sayHello, 3); // Prints "Hello!" 3 times

We made a function that repeats sayHello three times! How fun is that?

Conclusion

Higher-order functions are like magical tools in JavaScript. They allow us to work with functions in amazing ways. We can pass functions around, create new ones, and use them with arrays. This makes our code cleaner and more fun!

Now you know about higher-order functions. Try using them in your own projects! The possibilities are endless. Happy coding!

--

--