闭包(closure)是指在函数内部创建一个新的作用域,使得函数内部的变量和函数可以被保留或者延长它们的生命周期而不被释放。
具体来说,当一个函数返回另一个函数时,内部函数可以访问外部函数的变量、参数以及其他内部函数,因为它们存储在该函数的闭包环境中。这样,即使外部函数已经执行完毕,闭包仍然保留了对其所需变量的引用,而这些变量和函数并没有被垃圾回收机制清除。
闭包在 JavaScript 中有着广泛的应用,比如封装变量、实现数据私有化、缓存结果等。
下面是一个使用闭包来实现缓存结果的示例:
function cache(func) {
// 存储结果
const results = {};
return function (arg) {
if (results[arg]) {
console.log("缓存中找到结果,返回缓存中的此结果");
return results[arg];
} else {
console.log("缓存中找不到结果,准备存入并返回此结果");
const result = func(arg);
results[arg] = result;
return result;
}
};
}
const add = cache(function (x) {
return x + 10;
});
console.log(add(5)); // 缓存中找不到结果,准备存入并返回此结果 15
console.log(add(5)); // 缓存中找到结果,返回缓存中的此结果 15
在上述示例中,cache
函数接收一个需要缓存结果的函数 func
作为参数,并且返回一个新的函数。这个新函数会在内部记录一个结果缓存的对象 results
,并且检查给定的参数 arg
是否已经在缓存中存在,如果存在,则直接从缓存中返回对应的结果;否则执行原函数并把计算结果存入缓存中。
通过这种方式,我们可以减少重复计算的开销,提高程序的性能,同时也保留了该函数之前的计算结果。这个过程就是通过闭包来实现的。
高阶函数(Higher-order function)是指能够接收其他函数作为参数或者返回一个函数作为结果的函数。在 JavaScript 中,函数可以作为一等公民,具有和其他类型一样的权利和特殊的地位,因此高阶函数也得以广泛应用。
例如,Array
的原型对象中的 map
和 filter
方法就是高阶函数的典型例子。它们都接受一个函数作为参数,并将这个函数应用于数组元素上,最终返回一个新的经过处理的数组。这些方法可以用来过滤、映射、排序或者转换数组中的数据格式等。
高阶函数可以帮助我们把代码进行模块化、提高代码的复用性和可读性,并且使得程序更加灵活、易于扩展。
柯里化(Currying)是一种函数式编程的技术,它可以将接受多个参数的函数转化为一系列嵌套的单一参数函数。
具体来说,柯里化就是把一个多参数函数转化为多个单参数函数的过程。在 JavaScript 中实现柯里化通常使用闭包和高阶函数。例如,一个接受两个参数的普通函数 add(a, b) 可以转化为柯里化函数 curriedAdd(a)(b),这样我们可以分别传入不同的参数来调用这个函数,实现更加灵活的使用。
下面是一个 JavaScript 中实现柯里化的示例:
function add(x) {
return function(y) {
return x + y;
};
}
const curriedAdd = add(2);
console.log(curriedAdd(3)); // 5