理解Javascript的闭包

出处: 作者: Neo     
来源:  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'


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值