Javascript 对于循环和动画,可以';不要使用变量,因为因闭包而更改

Javascript 对于循环和动画,可以';不要使用变量,因为因闭包而更改,javascript,jquery,scope,Javascript,Jquery,Scope,我有以下代码: var newTR = '<tr class=".small"></tr>'; var i=300, v=0; for (var product in products){ i=i+300; v++; var newTD+v = '<td>'+'img'+'</td>'+ '<td>'+prod

我有以下代码:

   var newTR = '<tr class=".small"></tr>';
   var i=300, v=0;

    for (var product in products){
        i=i+300;
        v++;

        var newTD+v =
            '<td>'+'img'+'</td>'+
                '<td>'+products[product].partNumber + ' ' + products[product].description+'</td>'+
                '<td class="productPrice">' + toDollars(products[product].price) + '</td>'+
                '<td class="productQty">'+products[product].qty+'</td>'+
                '<td>'+ products[product].price * products[product].qty+'</td>'+
                '<td><button class="removeProductClass">x</button></td>';

        $(newTR)
            .delay(i)
            .insertAfter(self.cartTableHeader)
            .switchClass( "small", "big", 500, "easeInOutQuad")
            .queue(function(){
                $(this).append(newTD)
                    .children()
                    .hide()
                    .fadeTo(1000, 1);
                    $(this).dequeue();
                })
            .queue(function(){
                self.calcSubTotal();
                $(this).dequeue();
                });


    }
}
var newTR='';
var i=300,v=0;
用于(产品中的var产品){
i=i+300;
v++;
var newTD+v=
“+”img“+”+
''+产品[产品]。零件号+''+产品[产品]。说明+''+
''+美元(产品[产品].价格)+''+
''+产品[产品].数量+''+
''+产品[产品]。价格*产品[产品]。数量+''+
“x”;
美元(新台币)
.延迟(i)
.insertAfter(self.cartTableHeader)
.switchClass(“小”、“大”、500、“易用室外”)
.queue(函数(){
$(this).append(newTD)
.儿童()
.hide()
.fadeTo(1000,1);
$(this.dequeue();
})
.queue(函数(){
self.calcSubTotal();
$(this.dequeue();
});
}
}
问题是newTD变量的值是相同的 因为闭包使用的是在newTD上设置的最后一个值 由于动画发生较晚,当for循环已完成时

如何克服这一点(

谢谢你的阅读


Sean.

将有问题的代码封装在一个自动执行函数中,如下所示:

       (function(newTD){
          $(newTR)
            .delay(i)
            .insertAfter(self.cartTableHeader)
            .switchClass( "small", "big", 500, "easeInOutQuad")
            .queue(function(){
                $(this).append(newTD)
                    .children()
                    .hide()
                    .fadeTo(1000, 1);
                    $(this).dequeue();
                })
            .queue(function(){
                self.calcSubTotal();
                $(this).dequeue();
                });
       })(newTD);

您需要使用当前值newTD和任何其他要传递的数据调用函数,然后使用该信息调用延迟。
var newTD+v=
的语法无效。实际上,我在这里没有看到任何闭包?如果您在正确的位置使用了闭包,它会工作的。嗨,Bergi,是的,因为newTD的值正在下降,所以存在闭包进入所有队列函数,公开最后一个值集。