2013-05-09 139 views
0

我已经在下面的两个循环中声明了变量elem;但是,当第一个循环中的匿名函数被调用时(在完成400ms fadeOut效果之后),elem似乎指的是在第二个循环中分配的elem的值。换句话说,如果将第二个循环中的elem重命名为任何其他变量名称,则代码正常工作。jquery回调匿名函数关闭

有没有办法围绕匿名函数进行闭包,以使elem的值在匿名函数的上下文中没有改变?

for (var i = 0; i < outs.length; i++) { 
    var elem = this.elementAtPoint(outs[i]); 

    $(elem).fadeOut(400, function() { 
    $(elem).removeClass("white black queen"); //UPDATE 
    $(elem).show(); 
    }); 
    //$(elem).css("background", "red"); 
} 

for (var i = 0; i < ins.length; i++) { 
    var elem = this.elementAtPoint(ins[i]); 
    var piece = this.board.pieceAt(ins[i]); 

    $(elem).hide(); 

    $(elem).addClass(this.classForPiece(piece)); 

    $(elem).fadeIn(400); 
} 
+3

没有在JavaScript中没有块范围,只有所定义的功能范围 – 2013-05-09 03:41:49

+1

什么'out'?你可以用jQuery的'$ .each'循环数组和对象,这会创建一个新的作用域。 – elclanrs 2013-05-09 03:42:40

+0

您可以了解更多关于JavaScript JavaScript的提示 – 2013-05-09 03:51:09

回答

2

你可以使用匿名的自我执行功能

for (var i = 0; i < outs.length; i++) { 
    (function(elem){ 
     $(elem).fadeOut(400, function() { 
      $(elem).removeClass("white black queen"); //UPDATE 
      $(elem).show(); 
     }); 
     //$(elem).css("background", "red"); 
    })(this.elementAtPoint(outs[i])); 
} 
0

在javascript中,变量作用域是由函数决定的,所以你可以将两个for循环包装成两个函数。包装功能例如:

(function(){ 
    //put you for loop here 
})(); 
0

我会避免产生循环中的大量倒闭,因为他们创造的电流范围的副本,他们将是低效的。相反,我会简单地创建一些额外的功能,然后打电话给他们你的循环里面:

var fadeInPiece = function(elem, piece){ 
    $(elem).hide(); 
    $(elem).addClass(this.classForPiece(piece)); 
    $(elem).fadeIn(400); 
} 

var fadeOutElem = function(elem){ 
    $(elem).fadeOut(400, function() { 
    $(elem).removeClass("white black queen"); //UPDATE 
    $(elem).show(); 
    }); 
} 

for (var i = 0; i < outs.length; i++) 
    fadeOutElement(this.elementAtPoint(outs[i])); 

for (var i = 0; i < ins.length; i++) 
    fadeInPiece(this.elementAtPoint(ins[i]), this.board.pieceAt(ins[i]));