0

elem以下の両方のループで変数を宣言しました。ただし、最初のループで無名関数が呼び出されると (400ms のfadeOut効果が終了した後)、は 2 番目のループで割り当てられelemた値を参照しているようです。つまり、 2 番目のループで別の変数名に名前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では変数のスコープが関数ごとに決まるので、2つのforループを2つの関数でラップすることができます。ラッパー関数の例:

(function(){
    //put you for loop here
})();
于 2013-05-09T03:44:32.027 に答える