在javascript中获取循环中对象的正确索引

在javascript中获取循环中对象的正确索引,javascript,raphael,Javascript,Raphael,我有一个节点列表,我将使用raphael对象绘制每个节点。我有以下循环: for(var i=0; i<curNodes.length; i++){ var node = curNodes[i]; var obj = paper.rect(node.getX(), node.getY(), node.width, node.getHeight()) .attr({fill:nodes[i].getColor(), "fill-opacity": 0.6}) .c

我有一个节点列表,我将使用raphael对象绘制每个节点。我有以下循环:

for(var i=0; i<curNodes.length; i++){
    var node = curNodes[i];
    var obj = paper.rect(node.getX(), node.getY(), node.width, node.getHeight())
   .attr({fill:nodes[i].getColor(), "fill-opacity": 0.6})
   .click(function(e){ onMouseClicked(i,e); });
}
调用函数时应如何访问正确的索引?

尝试以下操作:

.click((function (i) {
    return function (e) {
        onMouseClicked(i,e);
    };
})(i));
正如您所注意到的,
i
(或函数中的参数)的值是
for
循环的最后一个索引。这是因为
click
事件不会立即发生-绑定会立即发生,但不会捕获
i
的值。当
click
处理程序实际执行时(无论以何种方式触发
click
事件),for循环已完成(很久以前),并且
i
的值是循环的最终值。您可以使用如上所述的闭包捕获
i
的值

虽然我知道另一种处理方法,但我认为清洁剂是:

.click(clickHandler(i));

function clickHandler(index) {
    return function (e) {
        onMouseClicked(i, e);
    };
}
试试这个:

.click((function (i) {
    return function (e) {
        onMouseClicked(i,e);
    };
})(i));
正如您所注意到的,
i
(或函数中的参数)的值是
for
循环的最后一个索引。这是因为
click
事件不会立即发生-绑定会立即发生,但不会捕获
i
的值。当
click
处理程序实际执行时(无论以何种方式触发
click
事件),for循环已完成(很久以前),并且
i
的值是循环的最终值。您可以使用如上所述的闭包捕获
i
的值

虽然我知道另一种处理方法,但我认为清洁剂是:

.click(clickHandler(i));

function clickHandler(index) {
    return function (e) {
        onMouseClicked(i, e);
    };
}
这是因为变量
i

for (var i = 0; i < curNodes.length; i++) {
    (function(i) {
        var node = curNodes[i];
        var obj = paper.rect(node.getX(), node.getY(), node.width,
                node.getHeight()).attr({
                    fill : nodes[i].getColor(),
                    "fill-opacity" : 0.6
                }).click(function(e) {
                    onMouseClicked(i, e);
                });
    })(i);
}
for(var i=0;i
这是因为变量
i

for (var i = 0; i < curNodes.length; i++) {
    (function(i) {
        var node = curNodes[i];
        var obj = paper.rect(node.getX(), node.getY(), node.width,
                node.getHeight()).attr({
                    fill : nodes[i].getColor(),
                    "fill-opacity" : 0.6
                }).click(function(e) {
                    onMouseClicked(i, e);
                });
    })(i);
}
for(var i=0;i
请参见:请参见: