在完整函数中访问变量w /

时间:2011-08-30 20:56:53

标签: javascript jquery

for (var i = 0; i < 32; i++) {
    var thisId = dropId+i;
    $("#p"+thisId).animate({ left:"+=32px" }, function(){
        if ($("#p"+thisId).position().left == 1024) {
            $("#p"+thisId).remove();
            window.console.log("removed");
        }
    });
}

在上面的代码示例中,当我开始执行animate的完整函数时,thisId表示来自for循环的最后一个赋值,而不是我想要为循环的每次迭代传入的值。有没有办法让它访问正确的thisId

3 个答案:

答案 0 :(得分:7)

JavaScript没有块范围。您可以通过调用函数来创建新范围。 E.g。

for (var i = 0; i < 32; i++) {
    (function(thisId) {
        $("#p"+thisId).animate({ left:"+=32px" }, function(){
            if ($("#p"+thisId).position().left == 1024) {
                $("#p"+thisId).remove();
                window.console.log("removed");
            }
        });
    }(dropId+i)); // <-- calling the function expression and passing `dropId+i`
}

变量声明区域始终提升到函数的顶部。因此,即使你在循环中有声明,它实际上也是如下:

var i, thisId;
for(...) {
    thisId = dropId + i;
    //...
}

您在循环中创建的每个闭包引用相同的thisId。就像在Highlander中一样:“只能有一个。”

答案 1 :(得分:0)

您需要在当前thisId周围使用闭包。

for (var i = 0; i < 32; i++) {
    var thisId = dropId+i,
        complete = (function(id) {
            return function() {
                if ($("#p"+id).position().left == 1024) {
                    $("#p"+id).remove();
                    window.console.log("removed");
                }
            }
        }(thisId));
    $("#p"+thisId).animate({ left:"+=32px" }, complete);
}

答案 2 :(得分:0)

只需将您在匿名函数中包含的内容包装起来就可以了:

for (var i = 0; i < 32; i++) {
    (function() {
        var thisId = dropId+i;
        $("#p"+thisId).animate({ left:"+=32px" }, function(){
            if ($("#p"+thisId).position().left == 1024) {
                $("#p"+thisId).remove();
                window.console.log("removed");
            }
        });

    })();
}