【问题标题】:Closure in Javascript [duplicate]Javascript中的闭包[重复]
【发布时间】:2009-11-14 16:34:22
【问题描述】:

可能重复:
Passing values to onclick

我有 100 个 ID 为 divNum0,...,divNum99 的元素。每次单击时都应使用正确的参数调用doTask

不幸的是,下面的代码没有关闭 i,因此 doTask 被调用,所有元素都是 100。

function doTask(x) {alert(x);}

for (var i=0; i<100; ++i) {
    document.getElementById('divNum'+i).addEventListener('click',function() {doTask(i);},false);
}

有没有办法让函数调用正确的参数?

【问题讨论】:

  • 如果您不需要添加多个事件监听器,您应该分配给onclick,因为这适用于跨浏览器
  • 我还建议考虑使用事件委托并将点击处理程序放在父元素中。当点击事件触发时,您只需检查目标并执行所需的功能。

标签: javascript loops greasemonkey closures


【解决方案1】:

虽然(正确)答案是the duplicate,但我想指出一种更高级的方法——用迭代器替换循环,它有效地解决了javascript“后期绑定”闭包问题。

loop = function(start, end, step, body) {
    for(var i = start; i != end; i += step)
       body(i)
}

loop(1, 100, 1, function(i) {
   // your binding stuff
})

【讨论】:

    【解决方案2】:

    通过自执行函数字面量(或命名工厂函数)创建闭包

    function doTask(x) { alert(x); }
    
    for(var i = 100; i--;) {
        document.getElementById('divNum' + i).onclick = (function(i) {
            return function() { doTask(i); };
        })(i);
    }
    

    或者使用DOM节点进行信息存储

    function doTask() { alert(this.x); }
    
    for(var i = 100; i--;) {
        var node = document.getElementById('divNum' + i);
        node.x = i;
        node.onclick = doTask;
    }
    

    后者对内存更友好,因为不会创建多余的函数对象。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 2017-07-22
    • 2021-10-22
    相关资源
    最近更新 更多