闭包是什么
在javaScript中,根据词法作用域的规则,内部函数一定能访问外部函数中的变量,当内部函数被拿到外部函数的之外调用时,即使外部函数执行完毕,但是内部函数对外部函数中的变量依然存在引用,那么这些被引用的变量会以一个集合的方式保存下来,这个集合就是 闭包。
作用
实现变量私有化
缺陷
闭包的缺陷主要体现在内存泄漏和性能问题上。由于闭包会保留对其创建时的词法作用域的引用,如果闭包持有对大量变量的引用,而且这些变量是不必要的,就会导致内存泄漏。此外,闭包的作用域链较长,可能会导致性能问题,因为在查找变量时需要遍历较长的作用域链。因此,在使用闭包时需要注意内存管理和性能优化,避免潜在的问题。
示例一
代码
function foo() {
function bar() {
var age = 18
console.log(myName);
}
var myName = 'Tom'
return bar
}
var myName = 'Jerry'
var fn = foo()
fn()
JavaScript引擎在执行该段代码的过程中会生成上图所示的一个栈结构,并且foo在执行完后会被销毁,但是由于bar需要引用foo内的myName变量,所以foo被销毁后会生成一个由bar所需引用的变量所组成的集合,这个集合被叫做闭包。
就好像从前有个人叫foo,他生了一个逆子叫bar,有一天bar离家出走了,并且foo要拆迁他没告诉bar,但是他知道bar会回来,所以为bar留下了他需要的背包,这个背包就是闭包
示例二
代码
function add() {
let count = 1
function fn() {
return count++
}
return fn
}
var res = add()
console.log(res()); // 1
console.log(res()); // 2
console.log(res()); // 3
add执行完毕被销毁并生成一个 add closure,里面存放counter = 1,调用了三次打印的结果依次是1 2 3。
结语
如果有错误望大家来指正。