2013-05-09 63 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]));