0

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

有没有办法在匿名函数周围进行闭包,以便在匿名函数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);
}
4

3 回答 3

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]));
}
于 2013-05-09T03:44:56.540 回答
0

在 javascript 中,变量范围由函数决定,因此您可以将两个 for 循环包装在两个函数中。包装函数示例:

(function(){
    //put you for loop here
})();
于 2013-05-09T03:44:32.027 回答
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]));
于 2013-05-09T03:55:23.977 回答