前言
闲来无事,聊聊闭包?
定义
闭包(Closure)是指在函数内部创建的函数,它可以访问并记住其词法作用域(即创建该函数时所处的环境)。换句话说,闭包是一个函数及其相关的引用环境的组合体。
组成
1. 内部函数:在外部函数内部定义的函数,具有对外部函数作用域的访问权限。
2. 词法环境(Lexical Environment):内部函数创建时所处的作用域,包含其定义时可访问的变量、函数和其他闭包。
闭包的特性使得内部函数可以在其创建后继续访问和操作其所处环境中的变量,即使外部函数已经执行完毕,外部函数的变量仍然可以被内部函数引用。
用途
闭包的主要用途有:
1. 封装数据和行为:内部函数可以访问外部函数的变量和参数,从而形成一个封闭的作用域,保护数据的安全性。
2. 创建私有变量和方法:通过闭包可以模拟私有变量和方法,外部无法直接访问,只能通过内部函数提供的接口来操作。
3. 保持状态和记忆:由于闭包可以记住其创建时的环境,可以在函数调用之间保持状态和记忆。
注意
需要注意的是,闭包的使用要避免造成内存泄漏,因为闭包中仍然引用着外部函数的变量,导致这些变量无法被垃圾回收。因此,在使用闭包时要注意及时释放不再需要的引用。
总结:闭包是在函数内部创建的函数,并可以访问其创建时的词法环境。它可以封装数据和行为,创建私有变量和方法,并保持状态和记忆。
事例
function outerFunction() {
var outerVariable = 'I am from outer function';
function innerFunction() {
console.log(outerVariable);
}
return innerFunction;
}
var closure = outerFunction();
closure(); // 输出:I am from outer function
在这个示例中,outerFunction 是外部函数,innerFunction 是内部函数。innerFunction 定义在 outerFunction 内部,因此它可以访问 outerFunction 的作用域,包括其中定义的变量 outerVariable。
当执行 outerFunction 并将其返回值赋给 closure 变量时,实际上是将内部函数 innerFunction 赋值给了 closure。由于 closure 是内部函数的引用,它保留了对外部函数作用域的访问权限。
最后,通过调用 closure(),内部函数被执行,输出了外部函数作用域中的变量 outerVariable 的值。
这个示例中的 innerFunction 就是一个闭包,它捕获了外部函数作用域中的变量,并且在外部函数执行完毕后仍然能够访问和操作这些变量。
OK!就这么多....