1

我知道,很好的标题;-)

无论如何,假设我有以下代码(我这样做):

function GetArray(i) {
    if (i == 0) {
        return [1, 2, 3];
    }
    return [];
}

for (var i = 0; i < 3; i++) {
    var array = GetArray(i);

    var onClick = function() {
        alert(array.length);
    }

    var html = "<a>click me</a><br/>";
    var element = $(html);
    $("div").append(element);

    element.click(onClick);
}​

在此处查看工作代码

单击 3 个链接,并注意每个值为 0 的警报。

我想要的是第一个链接在点击时提醒 3。

现在,在你们都开始大喊为什么会发生这种情况之前,我知道 onClick 函数正在使用对同一数组实例的引用进行清除,因此循环的每次迭代都会“更改”数组,而不是创建一个新的,这就是为什么实际上最后一个数组值用于所有点击事件。

所以问题是,我能做些什么来完成这项工作?

我想尝试在函数内部“克隆”不起作用的数组(我使用过.slice(0))并且可能正确地不起作用。另外,我猜它甚至可能只是完全相同的功能被用于所有 3 个事件。

4

1 回答 1

2

每当发生这种情况时,它就是一个范围界定问题。每次通过数组时,您都需要将数组锁定到 onClick 处理程序。你可以通过一个自调用函数在它周围创建一个闭包来做到这一点。

for (var i = 0; i < 3; i++) {
    var array = GetArray(i), onClick;

    // create a closure around onClick and array
    (function(array){
        onClick = function() {
            alert(array.length);
        }
    })(array);

    var html = "<a>click me</a><br/>";
    var element = $(html);
    $("div").append(element);

    element.click(onClick);
}​

请注意,这将提醒 3、0、0,因为第二次和第三次通过 leep 您返回一个空数组。

于 2012-05-09T14:49:14.207 回答