Practical Examples

Introduction

Higher-order functions (HOFs) are one of the most powerful features of JavaScript. A higher-order function is a function that either:

  • Accepts one or more functions as arguments, or

  • Returns another function.

Higher-order functions help developers write clean, reusable, and modular code. They are widely used in modern JavaScript development for callbacks, array methods, event handling, asynchronous programming, promises, closures, and functional programming.

For automation engineers, higher-order functions are commonly used in Playwright, Selenium (JavaScript), Cypress, API testing, utility libraries, reusable test components, and data-driven testing.


Example 1: Passing a Function as an Argument

function greet() {

    console.log("Hello!");

}

function execute(callback) {

    callback();

}

execute(greet);

Output

Hello!

The execute() function receives another function as an argument and executes it.


Example 2: Returning a Function

function createGreeting() {

    return function () {

        console.log("Welcome!");

    };

}

const greet = createGreeting();

greet();

Output

Welcome!

The outer function returns another function.


Example 3: Calculator Using Higher-Order Functions

function calculate(a, b, operation) {

    return operation(a, b);

}

function add(x, y) {

    return x + y;

}

console.log(calculate(10, 20, add));

Output

30

The calculator can perform different operations depending on the function passed.


Example 4: Multiplication Using an Arrow Function

function calculate(a, b, operation) {

    return operation(a, b);

}

const multiply = (x, y) => x * y;

console.log(calculate(5, 6, multiply));

Output

30

Example 5: Custom Greeting Generator

function createGreeting(message) {

    return function (name) {

        console.log(message + " " + name);

    };

}

const welcome = createGreeting("Welcome");

welcome("Alice");

Output

Welcome Alice

Example 6: Using map()

const numbers = [1, 2, 3, 4];

const squares = numbers.map(number => number * number);

console.log(squares);

Output

[1, 4, 9, 16]

The callback passed to map() is an example of a higher-order function in action.


Example 7: Using filter()

const numbers = [12, 25, 8, 30, 15];

const result = numbers.filter(number => number >= 18);

console.log(result);

Output

[25, 30]

Example 8: Using find()

const employees = [

    "John",

    "David",

    "Alice"

];

const employee = employees.find(name => name === "David");

console.log(employee);

Output

David

Example 9: Using forEach()

const fruits = ["Apple", "Mango", "Orange"];

fruits.forEach(fruit => {

    console.log(fruit);

});

Output

Apple
Mango
Orange

Example 10: Using setTimeout()

setTimeout(() => {

    console.log("Executed after 2 seconds");

}, 2000);

Output

Executed after 2 seconds

The callback executes after the specified delay.


Real-World Example 1: Order Processing

function processOrder(callback) {

    console.log("Order Processed");

    callback();

}

function sendInvoice() {

    console.log("Invoice Sent");

}

processOrder(sendInvoice);

Output

Order Processed
Invoice Sent

Real-World Example 2: Discount Calculator

function createDiscount(rate) {

    return function (price) {

        return price - (price * rate);

    };

}

const tenPercent = createDiscount(0.10);

console.log(tenPercent(5000));

Output

4500

Automation Testing Examples

Higher-order functions are widely used in automation frameworks to create reusable and configurable test code.

Playwright Example

function runTest(callback) {

    console.log("Starting Test");

    callback();

}

runTest(() => {

    console.log("Launching Chromium");

});

Output

Starting Test
Launching Chromium

Selenium Example

function executeStep(step) {

    step();

}

function openApplication() {

    console.log("Opening Application");

}

executeStep(openApplication);

Output

Opening Application

Cypress Example

function executeTest(callback) {

    callback("Login Test");

}

executeTest(testName => {

    console.log("Executing " + testName);

});

Output

Executing Login Test

API Testing Example

function validateResponse(callback) {

    callback(200);

}

validateResponse(statusCode => {

    console.log(statusCode === 200);

});

Output

true

Data-Driven Testing Example

function processUser(callback) {

    callback("admin");

}

processUser(username => {

    console.log("Executing test for " + username);

});

Output

Executing test for admin

Advantages of Higher-Order Functions

  • Promote code reuse.

  • Reduce duplicate code.

  • Improve readability.

  • Encourage modular programming.

  • Support functional programming.

  • Simplify asynchronous programming.

  • Make code easier to maintain.


Common Real-World Uses

Higher-order functions are used in:

  • Array methods (map(), filter(), find(), reduce(), forEach())

  • Event listeners

  • Timers (setTimeout(), setInterval())

  • Promises

  • Async/await

  • Middleware

  • Closures

  • Factory functions

  • Automation frameworks


Common Mistakes

Calling Instead of Passing a Function

Incorrect:

execute(greet());

Correct:

execute(greet);

Forgetting to Return a Function

Incorrect:

function createMessage() {

    console.log("Hello");

}

Correct:

function createMessage() {

    return function () {

        console.log("Hello");

    };

}

Forgetting to Execute the Returned Function

const message = createGreeting();

The function is stored but never executed.

Correct:

message();

Best Practices

Use Descriptive Function Names

Examples:

  • createValidator

  • processOrder

  • executeStep

  • runTest

  • calculate


Prefer Arrow Functions for Short Callbacks

Arrow functions make callback code shorter and easier to read.


Keep Callback Functions Focused

Each callback should perform one specific task.


Use Higher-Order Functions to Reduce Duplication

Instead of writing similar functions repeatedly, pass different behaviors using callback functions.


Conclusion

Higher-order functions are a cornerstone of modern JavaScript. They make code more reusable, flexible, and maintainable by allowing functions to accept other functions or return them.

From array methods and callbacks to closures and automation frameworks, higher-order functions are used throughout JavaScript development.

For automation engineers, mastering higher-order functions is essential for creating reusable Playwright scripts, Selenium utilities, Cypress commands, API helpers, and scalable automation frameworks.


Frequently Asked Questions (FAQs)

What is a higher-order function?

A higher-order function is a function that accepts another function as an argument or returns another function.


Why are higher-order functions useful?

They improve code reuse, flexibility, and modularity.


Are array methods like map() and filter() higher-order functions?

Yes. They accept callback functions as arguments.


Can arrow functions be used with higher-order functions?

Yes. Arrow functions are commonly used as callback functions.


Are callback functions and higher-order functions the same?

No. A higher-order function receives or returns a function, while a callback function is the function passed into the higher-order function.


Why are higher-order functions important in automation testing?

Automation engineers use higher-order functions to build reusable test utilities, configurable test steps, callback-based workflows, API validators, page object helpers, and data-driven testing frameworks, making automation code cleaner and easier to maintain.


Key Takeaways

  • Higher-order functions accept or return functions.

  • Callback functions are passed to higher-order functions.

  • Higher-order functions improve code reuse and flexibility.

  • They are widely used with array methods like map(), filter(), find(), and forEach().

  • Functions can also return other functions to create reusable behavior.

  • Higher-order functions support closures and factory functions.

  • Arrow functions are commonly used as callbacks.

  • Higher-order functions are essential for asynchronous programming.

  • They are heavily used in Playwright, Selenium, Cypress, API testing, and Node.js.

  • Mastering higher-order functions is an important step toward advanced JavaScript programming.