闭包
1. 什么是闭包(closure)
JavaScript闭包就是在另一个作用域中
保存了一份它从上一级函数或作用域取得的变量(键值对),
而这些键值对是不会随上一级函数的执行完毕而销毁的.
2. 举例
function funcA() { var x = 0; function funcB() { alert( ++x ); } return funcB; } var funcC = funcA(); funcC();
3. 分析
在执行完 " var funcC = funcA(); " 后,
变量 funcC 指向了函数 funcB.
funcB中用到了 funcA中的 变量x.
执行 funcC() 后, 会弹出对话框(x的值为1).
这段代码就创建了一个闭包.
因为函数funcA外的变量funcC引用了函数funcA内的函数funcB.
即,
当函数funcA的内部函数funcB 被函数funcA外的变量引用时,
就闯进了一个所谓的"闭包".
4. 闭包的作用
在 函数funcA执行完毕后,
闭包使得JS的GC不会回收funcA所占的资源,
因为funcA的内部函数funcB的执行需要依赖funcA中的变量.
5. 综上
1) 闭包与gc相关
2) 闭包涉及到一个对象的属性 何时被gc处理
3) 如何对对象的属性形成闭包,
即保护对象的属性在对象没用引用指向后, 不被销毁
function funcA() { var x = 0; function funcB() { alert( ++x ); } return funcB; } funcA(); // 此句结束后, 对象即可被回收, 属性x即可被销毁 var funcC = funcA(); // 不会销毁对象, 因为funcC可能会用到对象的属性 funcC();