闭包是什么? ——可简单理解为:有权访问另一个函数作用域内变量的函数都是闭包。
先看一段代码:
function add(){
var n = 0;
function inc(){
n++;
console.log(n);
}
return inc;
}
var test = add(); //注意:add()返回的是函数inc,那么这句话等同于 var test = inc;
test(); //test() 这句话等同于 inc()
test();
最后那三句话就相当于
var test = inc; //此时没有执行inc(),只是把test的指针指向inc的内存。
inc();
inc();
每个function就像一个独立的空间,别人是不能直接看不到里面的东西的。但是add()返回了一个函数inc,这就把add()里面的自由变量(inc中使用的变量)和外部联系起来,给外部访问自由变量n提供了一个出口,这就是闭包。
闭包的一个简单应用:封装
封装有一个很重要的作用就是信息隐藏,如果我们要把一些可见的和不可见的东西分开,可见的可以暴露给外部,不可见的不可以暴露给外部,这时候就可以使用闭包。
对于下面的例子,object就是一个闭包,它返回了一个对象。这个对象返回的属性是一组函数,这就是对外暴露的一组接口。这些接口可以共享一个自由变量num[],这个num[]是不能直接被外部访问的,但在暴露的这些接口里面都可以访问它,这样就做到了封装的作用。
var object = (function(){
var num = [];
return{
add:function(obj){
num.push(obj);
},
length:function(){
return num.length;
},
get:function(){
return num;
}
}
})