闭包是指有权访问另一个函数作用域中的变量的函数,即使这个变量在原函数被返回后已经被销毁。
具体来说,当一个内部函数被其外部函数以及外部函数的变量引用时,就形成了一个闭包。这个闭包包含了内部函数以及外部函数的变量,这些变量在内部函数中依然可以被访问到。由于 JavaScript 中的函数是一等公民,可以作为参数传递,也可以作为返回值返回,因此闭包也常常出现在高阶函数中。
使用闭包可以实现许多功能,例如:
1、封装变量:可以使用闭包将变量私有化,只能通过函数提供的接口来访问和修改,从而实现封装的效果。
2、延迟执行:可以使用闭包来延迟执行函数,将一些操作保存起来,待需要执行的时候再执行。
3、实现函数柯里化:柯里化是指将一个接受多个参数的函数变成接受单一参数(第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
4、实现函数记忆:函数记忆是指缓存函数的计算结果,从而提高函数的执行效率。
使用闭包也需要注意一些问题,例如:
1、内存泄漏:由于闭包会一直持有外部函数的作用域,因此如果闭包一直存在,外部函数的变量也无法被释放,可能会导致内存泄漏。
2、性能问题:由于闭包会持有外部函数的作用域,因此如果在循环中使用闭包,可能会导致性能问题,因为会创建大量的闭包。可以使用立即执行函数表达式(IIFE)或者使用 let 声明来避免这个问题。
闭包示例:
function outer() {
var x = 10;
function inner() {
console.log(x);
}
return inner;
}
var innerFunc = outer(); // 生成一个闭包
innerFunc(); // 输出 10
在上面示例中,一个函数返回一个内部函数,该内部函数可以访问到函数作用域内的变量,这样的函数就是闭包
更多前端面试题请看:存图,扫