您的位置:首页 > Web前端 > JavaScript

JavaScript 闭包

2016-03-27 11:28 549 查看

一、 最简单的闭包

function A() {
function B() {
console.log("This is B");
}
return B;
}
var c = A();


二、闭包的作用

涉及到Javascript中的GC机制:javascript中,如果一个对象不再被引用,这个对象会被GC回收,否则这个对象一直保存在内存中。

证明如下:

var closure = function() {
var count = 0;
var get = function() {
count ++;
return count;
}
return get;
};
var c = closure();

console.log(c());
console.log(c());
console.log(c());


执行结果为:



count 是 closure() 中的变量,它的值在 get() 中被改变,函数 get() 每执行一次,count 加1,因此,closure() 中的count 一直保存在内存中。也即全局变量 c 一直引用closure的内部变量count。

这就是闭包的作用:有时候我们希望一个模块中的变量一直保存在内存中,但又不会“污染”全局的变量,此时可用闭包来定义这个模块。

三、高端写法

var f = function(document) {
var viewport;
var obj = {
init: function(id) {
viewport = document.querySelector("#" + id);
},
addChild: function(child) {
viewport.appendChild(child);
},
removeChild: function(child) {
viewport.removeChild(child);
}
}
window.jView = obj; // 主要为这句代码
};

f(document);


执行 window.jView = obj 就是在window全局对象定义了一个变量 jView,并将这个变量指向obj对象,而 obj 对象中的函数又引用了 f() 函数中的变量 viewport,即全局变量 jView 一直引用 f 内的 viewport 变量,因此 viewport 变量不会被GC回收。满足闭包的条件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: