A Simple Demo
1 2 3 4 5 6 7 8
| function A() { function B(){ console.log("Hello closure!"); } return B; } var C = A(); C();
|
- 定义普通函数A,
- 在函数A中定义普通函数B,
- 函数A返回普通函数B。
- 在全局中定义C为A执行的结果
- 执行C
函数A的内部函数B被函数A外的一个变量C所引用
当一个内部函数被其外部函数之外的变量引用时,就形成了一个闭包
A Less Simple Demo
1 2 3 4 5 6 7 8 9 10 11 12 13
| function A() { var count = 0; function B() { count++; console.log(count); } return B; }
var C = A(); C(); C(); C();
|
在JavaScript中,如果一个对象不再被引用,那么这个对象就会被GC回收,否则一直保存在内存中
B在A中被定义,因此B依赖于A,而外部变量C引用了B,所以A间接被C引用。
A High-level Demo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| (function (document) { varviewport; varobj = { init: function(id) { viewport = document.querySelector('#'+ id); }, addChild: function(child) { viewport.appendChild(child); }, removeChild: function(child) { viewport.removeChild(child); } } window.jView = obj; })(document);
|
(function(){})为一个匿名函数,而()执行。
全局对象window引用了obj,而obj依赖于匿名函数,且操作其viewport,故形成闭包。
让你分分钟理解 JavaScript 闭包