前言
最近在复习JavaScript中的知识点,其中有个重要内容是:函数式编程。其中有三个重要的概念:一等公民的函数、纯函数和柯里化。
通过这篇文章和大家一起探讨这三个概念,并通过代码示例来加深理解。
PS:文章用的JavaScript编写代码示范。
一、一等公民的函数
在函数式编程中,函数被视为一等公民。这意味着函数可以像其他数据类型一样,被赋值给变量、作为参数传递给其他函数,甚至作为函数的返回值。这种特性赋予了函数极大的灵活性和表现力。
1、代码示范
// 将函数赋值给变量
function greet(name) {
return `Hello, ${name}!`;
}
let greetFunc = greet;
console.log(greetFunc("Alice"));
// 函数作为参数传递
function applyFunction(func, arg) {
return func(arg);
}
let result = applyFunction(greet, "Bob");
console.log(result);
// 函数作为返回值
function getGreetingFunction() {
function innerGreet(name) {
return `Hi, ${name}!`;
}
return innerGreet;
}
let innerGreetFunc = getGreetingFunction();
console.log(innerGreetFunc("Charlie"));
2、运行结果
二、纯函数
纯函数是函数式编程的另一个重要概念。一个函数如果满足以下两个条件,就被称为纯函数:
- 相同的输入总是返回相同的输出。
- 没有副作用,即不修改外部状态,不产生可观察的变化(如 I/O 操作、修改全局变量等)。
1、代码示范
// 纯函数示例
function add(a, b) {
return a + b;
}
// 非纯函数示例,因为它修改了外部状态
let count = 0;
function increment() {
count++;
return count;
}
2、代码分析
function add(a, b) {
return a + b;
}
- 输入输出特性:这个函数接受两个参数
a和b,无论何时调用这个函数,只要传入相同的a和b值,就一定会返回相同的结果。例如,add(2, 3)永远会返回5。- 无副作用:函数内部只是进行了加法运算并返回结果,没有修改任何外部的变量或状态,也没有进行任何如 I/O 操作等可能产生可观察外部变化的行为。
三、柯里化
柯里化是一种将多参数函数转换为一系列单参数函数的技术。通过柯里化,我们可以将一个函数的参数逐步传递,而不是一次性传递所有参数。
1、代码示范
// 普通函数
function addNumbers(a, b, c) {
return a + b + c;
}
//普通的 JavaScript 函数,接受三个参数a、b和c,返回它们的和。它需要一次性传入所有参数才能得到最终结果。
// 柯里化函数
function curryAdd(a) {
return function(b) {
return function(c) {
return a + b + c;
}
}
}
//curryAdd函数接受一个参数a。
//它返回一个内部函数,这个内部函数又接受一个参数b。
//这个内部函数又返回一个内部函数,这个最内层的函数接受参数c。
//最内层函数返回a + b + c,这里的a和b是来自外层函数的参数,这种机制利用了 JavaScript 的闭包特性,使得外层函数的参数在内部函数中依然可用。
let curriedAdd = curryAdd(1);
let curriedAdd2 = curriedAdd(2);
let result = curriedAdd2(3);
console.log(result);
2、运行结果

curryAdd(1)执行后,返回一个新的函数,这个新函数记住了a的值为 1,此时curriedAdd就相当于一个只接受参数b的函数。curriedAdd(2)执行后,又返回一个新的函数,这个新函数记住了a为 1,b为 2,此时curriedAdd2就相当于一个只接受参数c的函数。- 最后
curriedAdd2(3)执行,传入参数c为 3,最终计算并返回1 + 2 + 3的结果,即 6。
四、小结
本篇文章主要介绍了函数式编程的三个概念:一等公民的函数、纯函数和柯里化,但函数式编程还有其他重要的概念如:高阶函数、不可变数据、递归、函数组合。有兴趣的朋友可以先自行了解,后续我再找时间进行更新其他的核心概念。
如果你喜欢这篇文章,欢迎评论、点赞、收藏~
5161

被折叠的 条评论
为什么被折叠?



