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 闭包