闭包例子

为了避免下面的问题,理解内部函数能访问外部函数的实际变量而无须复制是很重要的

//糟糕的例子

//构造一个函数,用错误的方式给一个数组中的节点设置事件处理程序
//当点击一个节点时,按照预期,应该弹出一个对话框显示节点的序号
//但它总是会显示节点数目

var add_the_handlers = function(nodes){
    for(var i = 0; i < nodes.length; i++){
        nodes[i].onclick = function(e){
            alert(i)
        }
    }
}
var li  = document.getElementsByTagName("li")
add_the_handlers(li)

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

//改良后的例子

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

避免在循环中创建函数,它可能只会带来无畏的计算,还会引起混淆,正如上面的糟糕例子。我们可以先在循环之外创建一个辅助函数,让这个辅助函数再返回一个绑定了当前 i 值的函数,这个就不会导致混淆了

摘自《JavaScript语言精粹》一书

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值