闭包,从代码的形式上是在函数声明的内部声明另一个函数,从功能上讲,闭包是一种具有状态的函数,函数内的局部变量在函数调用后仍然有效。下面是一个闭包的简单的例子:
function f(){
var cnt = 0;
return function(){ return ++cnt;}
}
var fn=f(); //将函数的返回值赋给变量
fn();
fn();
fn(); 上面fn(); 的三次调用输出的分别是 1,2,3,这就说明f()在被调用后其局部变量仍然存在。
闭包的作用:
1、闭包实现访问器
function obj(){
var _x = 0;
// 返回一个定义了访问器的对象
return { get x() { return _x;},
set x(v) {_x =v;}
};
}
2、闭包实现信息隐藏
var obj = (function(){
//私有变量
var position = {x:2,y:3};
//私有函数
function sum_internal(a,b){
return Number(a)+Number(b);
}
return{
sum:function(a,b){ return sum_internal(a,b);},
x:position.x
};
}
)();
3、使用闭包实现计数器功能的类
function counter_class(i){
var cnt = i || 0; //设置默认参数
//在此声明私有变量,私有函数
return {
//公有方法
show:function(){ return cnt;},
//return this便于使用方法链
up:function(){cnt++; return this;},
down:function(){cnt--; return this;}
};
}