JS的闭包(总结)

104 阅读2分钟

什么是闭包

一个函数和对其周围状态(词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)。也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。在 JavaScript 中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。

在js中,变量的作用域属于函数作用域,在函数执行完后,作用域就会被清理,内存也会随之回收。但是由于闭包函数事建立在函数内部的子函数,由于其可以访问上级作用域,即使上级函数执行完,作用域也不会随之销毁,这时的子函数(也就是闭包),便拥有了访问上级作用域中变量的权限,即使上级函数执行完后作用域内的值也不会被销毁。

闭包解决的问题:

1.可以读取函数内部的变量

2.让这些变量的值始终保持在内存中,不会在函数调用后被清除

闭包应用场景:

在开发中,很多js代码都是‘事件驱动’的,比如:一个事件绑定的回调方法、发送ajax请求成功或失败的回调、setTimeout的延时回调、函数内部返回另一个匿名函数等等,这些都是闭包的应用。

闭包的缺点

1.由于闭包会使得函数中的变量都被保存到内存中,所以滥用闭包就很容易造成内存消耗过大,导致网页性能问题。---解决方法就是,在退出函数之前,将不再使用的局部变量全部删除。

2.闭包可以使的函数内部的值可以在函数外部进行修改,所以如果你把父函数当做对象(object)使用,把闭包当做它的公用方法(public method),把内部变量当做它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。