闭包[原文链接]
- 闭包是指可以访问另一个作用域变量的函数,一般是定义在外层函数中的内层函数。
为什么要使用闭包
- 局部变量无法共享和长期保存,而全局变量会造成变量污染,所以我们希望有一种机制既可以长久的保存变量又不会造成全局污染。
特点
*占用更多内存
- 不容易被释放
如何使用
- 定义外层函数,封装被保护的局部变量
- 定义内存函数,执行对外部函数变量的操作
- 外层函数返回内层函数的对象,并且外层函数被调用,结果保存在一个全局的变量中
函数的生命周期
定义函数时:
创建函数对象(封装了函数的定义)
创建作用域对象(默认存在一个window的引用)
调用时:
创建一个活动对象(AO)(局部作用域)(包含局部变量)
将AO的引用追加到作用域链对象中
创建执行环境(EC)(包含了作用域链(scope chain) 属性指向作用域对象)
调用后:
AO释放
作用域链中的AO引出栈
EC出栈
闭包的作用域链包含着它自己的作用域,以及包含它的函数的作用域和全局作用域。
内存泄漏
由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE浏览器中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。