闭包(Closure)与函数有着紧密的关系,以至于许多人将函数与闭包等同起来讨论,事实上在javascript中,一个函数只是一段静态代码,脚本文本,因此它是一个代码书写时,以及编译期的,静态的概念;而闭包则是函数的代码在运行过程中的一个动态环境,是一个运行期的,动态的概念。由于引擎对每个函数建立其独立的上下文环境,因此当函数再次被执行或者通过某种方法进入函数体内时就可以得到闭包内的全部信息。
闭包具有两个特点:第一是闭包作为与函数成对的数据,在函数执行过程中处于激活(即可访问)状态;第二是闭包在函数运行结束后,保持运行过程数据的最终状态。因此函数的闭包总的来说决定了两件事:闭包所对应的函数代码如何访问数据,以及闭包内的数据何时销毁。
function MyFunc() {
var data_1 = 123; //upvalue
var data_2 = new Array(); //upvalue
|
function func_1() { //.......... 闭包2
}
function func_n() { //.......... 闭包n
}
//................
}
上面这个例子并不能很好的传达出"闭包是运行前概念"这样的信息,仅能从静态的视觉效果上说明闭包,子函数闭包,upvalue之间的关系。 在运行过程中,子函数闭包(闭包2~n)可以访问upvalue;同一个函数中的所有子函数(闭包2~n),访问一份相同值的upvalue。
function MyFunc() {
var data = 100;
function func_1() {
Data = data * 5;
}
function func_n() {
Alert(date);
}
func_1();
func_n();
}
MyFunc();
由于func_1与func_n使用相同的upvalue变量data,因此在func_n中可以,由于func_1()对该值的修改,返回结果值500