闭包的概念
闭包是指有权访问另一个函数作用域中的变量的函数。
创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量。
闭包简单举例
function fn() {
return function () {};
}
var f = fn();
f();
var obj = (function () {
return {
abc: function () {},
};
})();
obj.abc();
var a = 10;
var obj = (function () {
var a = 1;
var data = { a: 1, b: 2 };
return {
run: function () {
data.a = ++a + data.a;
return data.a;
},
};
})();
var s = obj.run();
s=obj.run();
s=obj.run();
a += 20;
s=obj.run();
console.log(s); //15
function abc() {
var a = 10;
// setTimeout(function () {
// console.log(a);
// }, 2000);//闭包,直接调用了外部的变量
setTimeout(function (b) {
console.log(b);
}, 2000, a);//不是闭包,没有直接调用外面的变量
}
abc();
闭包的特点
- 函数嵌套函数
- 函数内部可以引用外部的参数和变量
- 参数和变量不会被垃圾回收机制回收
闭包的优点
- 封闭环境,使所有变量受到保护,不被污染
- 有了私有变量
- 变量可以长期驻扎在内存中,不会因为函数执行完成被销毁
闭包的缺点
容易造成内存泄漏,并且不能被垃圾回收机制回收。