对比看了几本书关于闭包的介绍,感觉《JavaScript面向对象编程指南》一书中介绍的最为清楚,其他部分书籍很多只讲结果,不讲具体原因,不易理解。总结如下
1、闭包的定义
- 如果一个函数会在其父级函数返回之后,留住对父级作用域的链接的话,闭包就会被创建起来。
2、闭包的特点
- 在函数A内部定义内部函数B。
- 内部函数B操作函数A的私有变量。
- 内部函数返回给外部变量使用,或被函数A立调用。
3、闭包实例
(1)基本的闭包
//通过返回内部函数实现对闭包内部函数的访问
function F1(param){
var N = function () {
return param;
};
param++;
return N;
}var inner=F1(1);
inner();
//inner()返回结果2,
//如果将return param;更改为return param++;,每次调用返回值增加1
此种方式类似于java语的类中的public函数功能,封装了对内部变量的访问
- (2)循环中的闭包 循环中的闭包比较容易引起误解,如下面的代码:
//循环中的闭包
function F2(){
var arrInner=[],i;
for (i=0;i<2;i++){
arrInner[i] = function () {
return i;
};
}
return arrInner;
//注意arrInner是个函数数组
}var closure_loop = F2();
closure_loop[0]();
//2
closure_loop[1]();
//2
在循环过程中,每次迭代都会创建一个返回当前循环号的新函数,即创建一个新的闭包,指向一个共同的局部变量i。但是闭包并不会记录他们的值,他们所拥有的只是相关域在创建时的一个引用。当返回函数要去获取某个变量时,会从其所在的域开始逐级寻找最近的i值,而循环结束时i值为2,所以返回函数都指向了这个值。
参考:
1、《JavaScript面向对象编程》第2版
2、《JavaScript核心概念及实践》