闭包定义:闭包(closure)是一个函数,通常也被成为闭包函数或绑定函数,该函数运行在一个特定的环境中,该环境中定义了一些本地的变量,当该函数被调用时,仍可以使用这些变量。
特征:当一个函数不位于它所处环境(变量作用范围)中被调用时,仍能使用本地变量。
(1)作为值从函数返回的函数是闭包函数。
例如下面的代码:代码函数A()位于一个特定的环境中(被嵌套在另一个函数B()中),并作为值从函数B()返回。
function B(){
var temp = "abc"; // 这是一个本地变量
function A(){ // 定义一个闭包函数,将使用本地变量
alert("闭包函数处理本地变量temp的值:"+temp);
}
return A; // 返回闭包函数
}
var myFunc = B(); // 调用函数B(),返回的是闭包函数A()
myFunc(); // 调用闭包函数A()
注意:myFunc()调用是在函数B()外面,按照常理,它不应该再访问到本地变量temp,但实际上仍可以访问,这就是闭包函数。
(2)利用变量作用范围也可以形成闭包函数。
一般来说,作为参数传递给函数的函数或作为值从函数返回的函数都是闭包函数,但是,利用变量作用范围也可以形成闭包函数。例如:
var A;
function B(){
var temp = "abc"; // 这是一个本地变量
A = function(){ // 定义一个闭包函数,将使用本地变量
alert("闭包函数处理本地变量temp的值:"+temp);
}
return A; // 返回闭包函数
}
B(); // 调用函数B()为变量A赋值
A(); // 调用闭包函数A()
可以看到,闭包函数A()的调用虽不在函数B()的局部作用范围内,但仍可以使用函数B()中定义的私有变量temp,这就是闭包。
闭包的核心是函数无论在哪里调用,仍可以访问它所处环境的变量,而这个变量在函数被调用的环境中是被其他程序访问不到的。
匿名自执行函数是非常好的利用闭包原理来实现的功能应用,使用get和set存取器方法定义属性也是一个很好的闭包原理应用。