一个常见的闭包函数的分析

先看个代码:

    //糟糕的例子
    //构造一个函数,用错误的方式给一个数组中的节点设置事件处理程序
    //当点击一个节点时,按照预期,应该弹出一个对话框显示节点的序号
    //但它总是会显示节点的数目
    var add_the_handlers=function(nodes){
        var i;
        for(var i=0;i<nodes.length;i++){
            nodes[i].onclick=function(e){
                alert(i);
            };
        }
    };

add_the_handlers函数的本意是想传递给每个事件处理器一个唯一值(i),但它未能达到目的,因为事件处理器函数绑定了变量i本身,而不是函数在构造时的变量i的值。

for循环有一个自己的小小作用域,每执行一次,只是将function赋给onclick事件,和函数内的内容无多大关系。最后点击时触发执行,此时的i已经为4,所以全部为4.该处重点理解 将函数当成一个数据类型,每循环一次相当于赋与函数一次,并未执行

    //改良后的例子
    //构造一个函数,用正确的方式给一个数组中的节点设置事件处理程序
    //点击一个节点时,弹出一个对话框显示节点的序号

    var add_the_handlers=function(nodes){
        var helper=function(i){
            return function(e){
                alert(i);
            };
        };
        var i;
        for(var i=0;i<nodes.length;i++){
            nodes[i].onclick=helper(i);
        }
    };

总结:
避免在循环中创建函数,它可能只会带来无谓的计算,还会引起混淆。
我们可以在循环之外创造一个辅助函数,让这个辅助函数再返回一个绑定了当前i值的函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值