闭包是指有权访问另外一个函数作用域中的变量的函数
创建闭包的方式
- 在一个函数内部创建另一函数
function func(){
var a = 1,b = 2;
function closure(){
return a+b;
}
return closure;
}
闭包的作用域链包含着它自己的作用域,以及包含它的函数的作用域和全局作用域
应用场景
- 创建私有变量
私有变量包括函数的参数、局部变量、在函数内部定义的其他函数
把有权访问私有变量的公有方法称为特权方法
function Animal(){
// 私有变量
var series = "哺乳动物";
function run(){
console.log("Run!!!");
}
// 特权方法
this.getSeries = function(){
return series;
};
}
- 模仿块级作用域(利用匿名自执行函数)
for (var i = 1; i <= 10; i++) {
(function (j) {
setTimeout(function () {
console.log(j);
}, 1000);
})(i);
}
- 定义模块
function module() {
var arr = [];
function add(val) {
if (typeof val == 'number') {
arr.push(val);
}
}
function get(index) {
if (index < arr.length) {
return arr[index]
} else {
return null;
}
}
return {
add: add,
get: get
}
}
var mod1 = module();
mod1.add(1);
mod1.add(2);
mod1.add('xxx');
console.log(mod1.get(1)); //2
console.log(mod1.get(2)); //null
闭包的优点:
- 防止对全局作用域的污染
- 私有成员
闭包的缺陷:
- 常驻内存会增大内存使用量,并且使用不当很容易造成内存泄露(不再用到的内存,没有及时释放,就叫做内存泄漏)。