来源:
http://coolshell.cn/articles/6731.html
发布时间:2012-03-12 23:34:51
内容摘抄:
闭包Closure就是:
- 闭包就是函数的局部变量集合,只是这些局部变量在函数返回后会继续存在。
- 闭包就是就是函数的“堆栈”在函数返回后并不释放,我们也可以理解为这些函数堆栈并不在栈上分配而是在堆上分配
- 当在一个函数内定义另外一个函数就会产生闭包
例子1:闭包中局部变量是引用而非拷贝
1
2
3
4
5
6
7
8
9
10
|
function
say667() {
// Local variable that ends up within closure
var
num = 666;
var
sayAlert =
function
() { alert(num); }
num++;
return
sayAlert;
}
var
sayAlert = say667();
sayAlert()
|
因此执行结果应该弹出的667而非666。
例子3:当在一个循环中赋值函数时,这些函数将绑定同样的闭包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
function
buildList(list) {
var
result = [];
for
(
var
i = 0; i < list.length; i++) {
var
item =
'item'
+ list[i];
result.push(
function
() {alert(item +
' '
+ list[i])} );
}
return
result;
}
function
testList() {
var
fnlist = buildList([1,2,3]);
// using j only to help prevent confusion - could use i
for
(
var
j = 0; j < fnlist.length; j++) {
fnlist[j]();
}
}
|
testList的执行结果是弹出item3 undefined窗口三次,因为这三个函数绑定了同一个闭包,而且item的值为最后计算的结果,但是当i跳出循环时i值为3,所以list[3]的结果为undefined.
例子5:每次函数调用的时候创建一个新的闭包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
function
newClosure(someNum, someRef) {
// Local variables that end up within closure
var
num = someNum;
var
anArray = [1,2,3];
var
ref = someRef;
return
function
(x) {
num += x;
anArray.push(num);
alert(
'num: '
+ num +
'\nanArray '
+ anArray.toString() +
'\nref.someVar '
+ ref.someVar);
}
}
closure1=newClosure(40,{someVar:
'closure 1'
});
closure2=newClosure(1000,{someVar:
'closure 2'
});
closure1(5);
// num:45 anArray[1,2,3,45] ref:'someVar closure1'
closure2(-10);
// num:990 anArray[1,2,3,990] ref:'someVar closure2'
|