问题:
- 什么是闭包
- 为什么需要闭包
- 闭包的优点和缺点
- 什么时候使用闭包
- 如何解决闭包造成的内存溢出
参考文档:
- http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
- https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures
什么是闭包
在代码中变量分为:全局变量和局部变量。
在 js 运行环境中存在链式作用域,即子对象会一级级往上获取父对象作用域的变量。所以所有父对象的变量,子对象都可以访问,但是反之则不行。
但是有时候我们需要在外部获取函数内的局部变量,所以就出现了闭包。
闭包:从内部函数可以访问外部函数作用域的函数
闭包是由函数以及创建该函数的词法环境组成而形成。这个环境包含了这个闭包创建时所能访问的所有局部变量。
代码模板如下:
function outer() {
function inner() {}
return inner();
}
inner 内可以访问 outer 内定义的所有变量,但是 outer 外部无法访问。
闭包的作用
优点
- 保护变量不受外界影响 — 在作用域内添加一个私有变量
- 使函数可以访问其他函数的变量 — 在函数执行环境中,添加一个公有变量
- 保护变量不被回收 — 公有变量长期保存在内存中,不会被销毁
缺点
由于引用变量不被释放,会形成一个不被销毁的作用域,导致内存溢出
闭包的使用场景
- 在函数中添加一个共享变量,但是这个变量不被外界所影响。
- 使用闭包实现对象的私有变量和私有方法。
如何解决闭包造成的内存溢出
- 在闭包使用完毕之后,切断引用变量的使用,可以将引用的变量设置为 null
- 避免变量的循环赋值和引用