• 优雅而高效的JavaScript——高阶函数


    在这里插入图片描述

    🙂博主:小猫娃来啦
    🙂文章核心:优雅而高效的JavaScript——高阶函数

    前言

    JavaScript是一种高级编程语言,它支持高阶函数。高阶函数是指可以接受一个或多个函数作为参数,或者返回一个函数的函数。在JavaScript中,函数是一等公民,这意味着函数可以像变量一样被传递、赋值和使用。这个特点使得JavaScript非常适合使用高阶函数。

    在本文中,我们将学习什么是高阶函数,以及如何在JavaScript中使用它们。我们还将探讨高阶函数的一些常见用途,如函数组合、柯里化和延迟执行。最后,我们将介绍一些常见的高阶函数,如map、filter和reduce。


    什么是高阶函数?

    高阶函数是指可以接受一个或多个函数作为参数,或者返回一个函数的函数。这个定义可能有点抽象,所以让我们看几个例子来帮助我们理解。

    首先,让我们看一个简单的例子。假设我们有一个函数,它接受两个数字并返回它们的和。

    function add(a, b) {
    return a + b;
    }
    
    • 1
    • 2
    • 3

    现在,让我们写一个高阶函数,它接受一个函数作为参数,并将该函数应用于两个数字。这个高阶函数将返回两个数字的结果。

    function calculate(a, b, operation) {
    return operation(a, b);
    }
    
    • 1
    • 2
    • 3

    现在,我们可以使用calculate函数来计算两个数字的和,如下所示:

    calculate(2, 3, add); // Output: 5
    
    • 1

    在这个例子中,我们将add函数作为calculate函数的第三个参数传递。calculate函数将调用add函数,并将2和3作为参数传递给它。add函数将返回它们的和,即5。最后,calculate函数将返回5。

    现在,让我们看一个更复杂的例子。假设我们有一个函数,它接受一个数字并返回该数字的平方。

    function square(x) {
    return x * x;
    }
    
    • 1
    • 2
    • 3

    现在,让我们写一个高阶函数,它接受一个函数作为参数,并将该函数应用于一个数字数组。这个高阶函数将返回一个新的数组,其中包含每个数字的结果。

    function map(array, operation) {
    var result = [];
    for (var i = 0; i < array.length; i++) {
    result.push(operation(array[i]));
    }
    return result;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    现在,我们可以使用map函数来计算一个数字数组的平方,如下所示:

    var numbers = [1, 2, 3, 4, 5];
    var squares = map(numbers, square); // Output: [1, 4, 9, 16, 25]
    
    • 1
    • 2

    在这个例子中,我们将square函数作为map函数的第二个参数传递。map函数将遍历数字数组,并将每个数字传递给square函数。square函数将返回该数字的平方,并将其添加到结果数组中。最后,map函数将返回结果数组。

    这些例子演示了高阶函数的两个常见用途:将函数作为参数传递和返回函数。现在,让我们看一些更高级的用法。


    函数组合

    函数组合是指将多个函数组合成一个函数。这个概念可能有点抽象,所以让我们看一个例子来帮助我们理解。

    假设我们有两个函数,一个函数将字符串转换为大写,另一个函数将字符串转换为标题案例(即每个单词的首字母大写)。现在,让我们将这两个函数组合成一个函数,它将字符串转换为大写标题案例。

    function toUpperCase(str) {
    return str.toUpperCase();
    }
    
    function toTitleCase(str) {
    return str.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
    }
    
    function toUpperCaseTitleCase(str) {
    return toTitleCase(toUpperCase(str));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    现在,我们可以使用toUpperCaseTitleCase函数将字符串转换为大写标题案例,如下所示:

    toUpperCaseTitleCase(“hello world”); // Output: “Hello World”

    在这个例子中,我们定义了一个新函数toUpperCaseTitleCase,它将字符串转换为大写标题案例。我们将toUpperCase函数和toTitleCase函数组合在一起,以实现这个功能。首先,toUpperCaseTitleCase函数将字符串传递给toUpperCase函数,将其转换为大写。然后,它将结果传递给toTitleCase函数,将其转换为标题案例。最后,toUpperCaseTitleCase函数将返回结果。


    柯里化

    柯里化是指将一个函数转换为接受一个参数的函数序列。这个概念可能有点抽象,所以让我们看一个例子来帮助我们理解。

    假设我们有一个函数,它接受三个数字并返回它们的和。

    function add(a, b, c) {
    return a + b + c;
    }
    
    • 1
    • 2
    • 3

    现在,让我们写一个柯里化的版本,它接受一个数字并返回一个新的函数。这个新的函数将接受另外两个数字,并返回它们的和。

    function curryAdd(a) {
    return function(b) {
    return function(c) {
    return a + b + c;
    }
    }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    现在,我们可以使用curryAdd函数将add函数柯里化,如下所示:

    curryAdd(2)(3)(4); // Output: 9
    
    • 1

    在这个例子中,我们使用curryAdd函数将add函数柯里化。首先,我们传递2作为参数给curryAdd函数。这将返回一个新的函数,它接受一个数字b并返回另一个新的函数。这个新的函数接受一个数字c并返回a + b + c的结果。然后,我们传递3作为参数给这个新的函数。这将返回另一个新的函数,它接受一个数字c并返回a + b + c的结果。最后,我们传递4作为参数给这个新的函数。这将返回a + b + c的结果,即9。

    使用柯里化可以使函数更加灵活和可复用。它允许我们将一个函数转换为接受一个参数的函数序列,这使得我们可以部分应用函数,或者将函数传递给其他函数。


    延迟执行

    延迟执行是指将函数延迟到稍后执行。这个概念可能有点抽象,所以让我们看一个例子来帮助我们理解。

    假设我们有一个函数,它接受一个数字并返回一个新的函数。这个新的函数将接受另一个数字,并返回它们的和。

    function add(a) {
    return function(b) {
    return a + b;
    }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    现在,让我们写一个delay函数,它接受一个函数和一个延迟时间(以毫秒为单位)。这个delay函数将返回一个新的函数,它将在延迟时间后执行原始函数。

    function delay(func, time) {
    return function() {
    var args = arguments;
    setTimeout(function() {
    func.apply(null, args);
    }, time);
    }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    现在,我们可以使用delay函数将add函数延迟执行,如下所示:

    var delayedAdd = delay(add(2), 1000); // Output: undefined
    
    • 1

    在这个例子中,我们使用delay函数将add函数延迟执行1秒钟。我们首先调用add函数,并将2作为参数传递。这将返回一个新的函数,它接受一个数字,并返回2 + b的结果。然后,我们将这个新的函数和1000毫秒的延迟时间传递给delay函数。delay函数将返回一个新的函数,它将在1秒后执行原始函数。最后,我们将这个新的函数赋值给delayedAdd变量。

    现在,我们可以使用delayedAdd函数来计算2 + 3的结果,如下所示:

    delayedAdd(3); // Output: 5
    
    • 1

    在这个例子中,我们调用delayedAdd函数,并将3作为参数传递。这将在1秒钟后执行原始函数,即将2和3相加。最后,它将返回5的结果。


    常见的高阶函数

    JavaScript中有许多常见的高阶函数,它们可以帮助我们更轻松地处理数组和对象。以下是一些常见的高阶函数:

    map:将一个数组转换为另一个数组,其中每个元素都是原始数组中元素的结果。

    var numbers = [1, 2, 3, 4, 5];
    var squares = numbers.map(function(x) {
    return x * x;
    }); // Output: [1, 4, 9, 16, 25]
    
    • 1
    • 2
    • 3
    • 4

    filter:将一个数组过滤为另一个数组,其中只包含满足某些条件的元素。

    var numbers = [1, 2, 3, 4, 5];
    var evenNumbers = numbers.filter(function(x) {
    return x % 2 === 0;
    }); // Output: [2, 4]
    
    • 1
    • 2
    • 3
    • 4

    reduce:将一个数组转换为一个值,其中每个元素都是使用前一个元素和当前元素的结果。

    var numbers = [1, 2, 3, 4, 5];
    var sum = numbers.reduce(function(acc, x) {
    return acc + x;
    }, 0); // Output: 15
    
    • 1
    • 2
    • 3
    • 4

    forEach:对一个数组中的每个元素执行一个函数,没有返回值。

    var numbers = [1, 2, 3, 4, 5];
    numbers.forEach(function(x) {
    console.log(x);
    }); // Output: 1 2 3 4 5
    
    • 1
    • 2
    • 3
    • 4

    总结

    高阶函数是JavaScript中非常有用的概念。它们允许我们将函数作为参数传递和返回函数,这使得我们可以实现函数的组合、柯里化和延迟执行等功能。在实际开发中,高阶函数可以帮助我们提高代码的灵活性和可复用性。很强大的东西,快用它吧。

    在这里插入图片描述


  • 相关阅读:
    Apache JMeter 和 Locust的对比
    史诗级外挂,肝完这份 MQ+ 分布式事务套餐,其实阿里 P8 你也值得
    Linux进程通信
    javaScript-事件循环-微任务-宏任务
    CSDN21天学习挑战赛之折半查找
    C/C++数据结构——列出连通集(深搜和广搜)
    gunicorn参数说明英文及译文
    c/c++语言算法技巧汇总大复习2
    SQL Server报错:数据库"YourDatabaseName"的事务日志已满,原因为"LOG_BACKUP"
    10-Linux输入输出
  • 原文地址:https://blog.csdn.net/dyk11111/article/details/133747914