什么是闭包
闭包:闭包是指有权访问另一个函数作用域中的局部变量的函数
即在JavaScript中仅可以通过闭包函数才可以访问某个函数内的局部变量。
(类似于php中只能通过public公有的方法来访问类中private私有属性)
function A(){
var a = 10; //函数内的局部变量a
function B(){
console.log(a);
}
return B; //返回函数B
}
var result = A(); // result是function B
result(); // 10
解释:
由于函数A内部的局部变量a不能被A以外的函数访问到,只能被A内部的子函数B访问到,这是由于JavaScript的‘链式作用域’结构导致的,既然只有内部函数B才可以访问到函数A中的局部变量,那么我们只需要把函数B作为函数A的返回值,就可以在函数A外部访问它的内部变量a! 其中函数B就是闭包。
问题,如何创建闭包?
由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。所以,在一个函数内部创建子函数,最后返回子函数,这是创建闭包最常见的方式。
严格来说,JS中所有的function都是闭包,一般来说,嵌套的function的闭包性更强。这也是我们平时接触和研究较多的地方。
闭包的作用
主要以下两个作用:
可以让我们在全局作用域中访问函数内的局部变量。(类似于php中访问类中的私有属性)。
保持对函数内部的变量持续引用,程序执行完毕前,可让局部变量一直驻留在内存中不销毁。
怎么理解“保持对函数内部的变量持续引用,脚本执行完毕前,让一个变量始终保存在内存中,让一个变量始终(一直)保存在内存中”这句话呢
请看以下代码:
function A(){
var a = 10;
function B(){
console.log(a++);
}
return B; //返回闭包函数B的函数体
}
var result = A();
result(); //
result(); //
result(); //
解析:
上面调用A函数把返回的结果赋值给变量result,变量result就是就是闭包B函数,它一共运行了三次,第一次的值是10,第二次11,第三次12,这说明函数A内的局部变量a一直保存在内存中,因为在javascript中,函数中的局部变量仅在函数执行的期间可用。一旦函数A()执行完毕,其内部的局部变量将不能被访问。这说明局部变量a并未在函数A()执行完毕后被销毁,导致程序执行完毕之前一直驻留在内存中。