闭包是一个可以访问外部作用域中变量的内部函数。这些被引用的变量直到闭包被销毁时才会被销毁。在本质上是函数内部和函数外部链接的桥梁。不会触发垃圾回收机制。
闭包属于一种特殊的作用域,称为静态作用域。它的定义可以理解为: 父函数被销毁的情况下,返回出的子函数的[[scope]]中仍然保留着父级的单变量对象和作用域链,因此可以继续访问到父级的变量对象,这样的函数称为闭包。 闭包会产生一个很经典的问题: 多个子函数的[[scope]]都是同时指向父级,是完全共享的。因此当父级的变 量对象被修改时,所有子函数都受到影响。 解决: 变量可以通过 函数参数的形式 传入,避免使用默认的[[scope]]向上查找。使用 setTimeout 包裹,通过第三个参数传入。使用 块级作用域,让变量成为自己上下文的属性,避免共享。
闭包的作用:
A、可以读取函数内部的变量
B、让这些变量的值始终保存在内存中。这是因为闭包的执行依赖外部函数中的变量,只有闭包执行完,才会释放变量所占的内存
1 闭包的作用(优点)
1)读取另一个函数作用域中的变量;
2)让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在。
3)封装对象的私有属性和私有方法。(然后在全局作用域中通过调用闭包就能访问函数中的变量)
2 闭包的缺点(坏处)
由于闭包会携带包含它的函数的作用域,因此会比其他函数占用更多的内存,过度使用闭包可能会导致内存占用过多的问题。所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。