JavaScript闭包学习

昨天在掘金上看到一篇关于闭包基础学习的文章JavaScript闭包入门

我对闭包的理解:一个函数嵌套另一个函数,子函数返回父函数的值,使得在函数外部也可以访问到函数内部的变量。

其中有一个梨子:

function buildList(list) {
    var result = [];
    for (var i = 0; i < list.length; i++) {
        var item = 'item' + i;
        result.push( function() {console.log(item + ' ' + list[i])} );//匿名闭包函数
    }
    return result;
}
function testList() {
    var fnlist = buildList([1,2,3]);
    // 使用j是为了防止搞混---可以使用i
    for (var j = 0; j < fnlist.length; j++) {
        fnlist[j]();
    }
}
 testList() //输出 "item2 undefined" 3 次
result.push( function() {console.log(item + ' ' + list[i])}这一行给result数组添加了三次函数匿名引用。如果你不熟悉匿名函数可以想象成下面代码:
pointer = function() {console.log(item + ' ' + list[i])};
result.push(pointer);
注意,当你运行上述代码的时候会打印"item2 undefined"三次!和buildList的局部变量对应的闭包只有一个。
当匿名函数在fnlist[j]()这一行调用的时候,他们使用同一个闭包,而且是使用的这个闭包里i和item现在的值(循环结束后i的值为3,item的值为'item2')。
注意:我们从索引0开始,所以item最后的值为item2',i的值会被i++增加到3 。




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值