返回介绍

高阶函数

发布于 2025-03-08 19:49:34 字数 2441 浏览 0 评论 0 收藏 0

举个例子,一个函数可以将其他函数作为参数和/或产生一个函数作作为它的返回值。 fancy 功能技术是非常强大的构造,可在 Javascript 或其他高级语言比如 python,lisp 等中使用。

我们来创建两个简单的函数, add_2double ,和一个高阶函数 mapmap 接受两个参数, funclist (它的声明因此为 map(func,list) ),返回一个数组。 func (第一个参数) 作为函数将被应用到每个数组 list (第二个参数)的元素中。

// 定义两个简单函数
var add_2 = function(x) {
    return x + 2;
};
var double = function(x) {
    return 2 * x;
};

//  map 接受两个参数
//  func    调用函数
//  list    数组中元素值传递给 func 
var map = function(func, list) {
    var output=[];              // 输出 list
    for(idx in list) {
        output.push( func(list[idx]) );
    }
    return output;
}


// 使用 map 将函数应用于整个输入列表
// 产生相应的输出列表
map(add_2, [5,6,7]) // => [7, 8, 9]
map(double, [5,6,7]) // => [10, 12, 14]

上述例子中的函数很简单。然而在作为参数传递给其他函数时,可以使用特殊组合方法构件更复杂的函数。

举个例子,如果注意到在代码中平凡使用调用方法 map(add_2, ...)map(double, ...) ,可以创建两个特殊用途的列表运行组合起来的函数。使用函数封装,可以如下操作:

process_add_2 = function(list) {
    return map(add_2, list);
}
process_double = function(list) {
    return map(double, list);
}
process_add_2([5,6,7]) // => [7, 8, 9]
process_double([5,6,7]) // => [10, 12, 14]

创建一个 buildProcessor 函数,它将函数 func 作为函数,返回一个 func 处理程序,这个函数将列表作为输入应用到 func

// 函数产生一系列处理程序
var buildProcessor = function(func) {
    var process_func = function(list) {
        return map(func, list);
    }
    return process_func;
}
// 调用 buildProcessor 返回一个调用输入列表的函数


// 使用 buildProcessor 产生 add_2 process_double:
process_add_2 = buildProcessor(add_2);
process_double = buildProcessor(double);

process_add_2([5,6,7]) // => [7, 8, 9]
process_double([5,6,7]) // => [10, 12, 14]

看另一个例子。 创建一个 buildMultiplier 函数,将 x 作为输入,然后一个对其参数 x 相乘的函数:

var buildMultiplier = function(x) {
    return function(y) {
        return x * y;
    }
}

var double = buildMultiplier(2);
var triple = buildMultiplier(3);

double(3); // => 6
triple(3); // => 9

Exercise 定义一个 `negate` 函数将 `add1` 作为参数,返回一个函数,这个函数通过 `add1` 返回值的相反数.(开始有点复杂了)

var add1 = function (x) {
    return x + 1;
};

var negate = function(func) {
    // TODO
};

// 应该返回 -6
// 因为 (5+1) * -1 = -6
negate(add1)(5);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文