Closure in JS(闭包)

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();//Hello closure!
  • 定义普通函数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();//1
C();//2
C();//3

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

Comments