高阶函数的两个特性
- 高阶函数除了可以接受函数作为参数外
- 还可以把函数作为结果值返回。
闭包函数的返回值也是函数
function lazy_sum(arr) {
var sum = function () {
return arr.reduce(function (x, y) {
return x + y;
});
}
return sum;
}
console.log()
let lazySum = lazy_sum(arr=[1,2,3,4,5]);
console.log(lazy_sum);
console.log(lazy_sum());
console.log(lazySum);
console.log(lazySum());
运行结果
[Function: lazy_sum]
[Function: sum]
[Function: sum]
15
Process finished with exit code 0
思考
- 闭包函数的返回值也是函数的引用
- 如果真正的想要执行函数
- 必须将函数进行调用才行
闭包函数的作用
azy_sum返回函数sum时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力
知识点总结
闭包(Closure)是 JavaScript 中一个重要且强大的概念,它允许函数访问并操作其外部函数作用域(父级作用域)的变量,即使在外部函数已经执行完毕的情况下也可以。
简单来说,闭包是一个函数和其相关的变量的组合,它们共同形成了一个闭合的作用域环境。
下面是一个简单的例子:
function outerFunction() {
let outerVariable = 10;
function innerFunction() {
console.log(outerVariable); // 在内部函数中访问外部函数的变量
}
return innerFunction;
}
const closureExample = outerFunction();
closureExample(); // 输出 10
在这个例子中,outerFunction
是一个外部函数,它包含一个局部变量 outerVariable
和一个内部函数 innerFunction
。innerFunction
可以访问 outerVariable
,即使在 outerFunction
执行完毕后也可以。
闭包的关键特点:
- 函数嵌套:内部函数嵌套在外部函数中。
- 内部函数引用外部变量:内部函数可以访问外部函数的变量,即使外部函数已经执行完毕。
- 返回内部函数:通常,外部函数会返回内部函数,从而使其保持在作用域中。
闭包的应用场景:
-
模块模式:通过闭包可以创建私有变量,使其不受外部访问。
-
函数工厂:可以用闭包来创建一个可以生成特定类型的函数的工厂。
-
事件处理程序:在事件处理程序中,闭包可以用来保留事件监听器的状态信息。
-
异步操作:在异步代码中,可以使用闭包来保留一些数据,以便在回调函数中使用。
-
避免全局污染:通过使用闭包,可以减少全局命名空间的污染。
请注意,过度使用闭包可能会导致内存泄漏,因为闭包会保持外部作用域的引用。因此,在使用闭包时,需要小心确保不会无意中保留大量不必要的内存。
总的来说,闭包是 JavaScript 中一个非常强大且灵活的特性,能够解决许多问题,但也需要谨慎使用以避免潜在的问题。