闭包,百度的解释为:
闭包是指可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。
MDN上关于闭包的解释:
函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起构成闭包(closure)。
维基百科关于闭包的解释:
闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是在支持头等函数的编程语言中实现词法绑定的一种技术。闭包在实现上是一个结构体,它存储了一个函数(通常是其入口地址)和一个关联的环境(相当于一个符号查找表)。
闭包是JavaScript学习者的成年礼,没理解闭包就不能说自己学会了JavaScript。闭包在编程中用的比较多,有时候自己在想,为什么需要闭包,闭包又是怎么产生的。
在JavaScript中函数是一等公民,函数的返回对象可以是简单类型也可以是函数,简单类型对外部依赖最少,但是函数除了定义函数内的变量以及逻辑操作还包含外部环境变量(上下文),为了使返回的函数是一个完整的功能块,势必要求函数所依赖的外部环境也一同提供。返回函数的外部依赖像是必须的配套支持,缺少外部依赖的函数是不完整的,也就无法提供正常的函数功能。由于函数每次运行都要进行一次完整全新的资源分配,因此返回的各闭包函数都拥有自己完整独立的一套外部环境(上下文),对外表象好像是类的不同实例,实例都拥有自己的私有变量。
var F=function(){
var i=0;
return {
add:function(){
i++;
},
display:function(){
console.log(i);
}
}
}
测试如下:
var f1=F();
f1.add();
f1.add();
f1.display();//2
var f2=F()
f2.add();
f2.display();//1
由此测试可看出f1,f2拥有各自的i变量。