4

ループ.each()内から匿名関数を使用する jQuery呼び出しを使用しています。forJSLint は、「ループ内で関数を作成しないでください」という警告を表示します。

これは、より大きな関数のコード スニペットです。本質的には、ゲームの各プレイヤーがまだ「生きている」かどうか (ボード上に少なくとも 1 つの駒があるかどうか) をチェックしています。

for( i=0 ; i<PLAYERLIMIT ; ++i ) {
    if( player[i].status !== 0 ) { //skip already dead players
        var stillAlive = false;
        $board.find("td").each( function() { //this func causes JSLint warning
            if( $(this).data("owner") === player[i].number ) {
                stillAlive = true;
                return false;
            }
        });
        if( !stillAlive ) {
            //... action to take for dead players
        }
    }
}

この警告を削除する方法を確認できます。関数を個別に宣言して呼び出すだけです。しかし、これは非常に小さなワンショット関数であり、基本的にこれをネストされたループの本体と見なします (基本的に呼び出しを次のようforに読んでいます) 。.each()for $("td") in $board {}

このJSLintはスタイル警告の1つを提供していますか?それとももっと深刻ですか?
基本的に、これを修正するのが最善ですか?

警告の理由を理解したいので、警告が存在する理由についてのコメントは役に立ちます(これも実用的かスタイルかを知りたいです)。

4

2 に答える 2

3

それは主にスタイルの問題であり、おそらくIEでいくらかの効率が得られますが、新しいJSエンジンはとにかくトレースエンジンを介して関数をインライン化します. 次のように、JSLint の「エラー」を取り除くことができます。

function setupPlayer(player) {
  var stillAlive = false;
  $board.find("td").each( function() {
      if( $(this).data("owner") === player.number ) {
          stillAlive = true;
          return false;
      }
  });
  if( !stillAlive ) {
      //... action to take for dead players
  }
}

for(var i=0 ; i<PLAYERLIMIT ; ++i ) {
    if( player[i].status !== 0 ) { //skip already dead players
        setupPlayer(player[i]);
    }
}

あなたはすべきですか?個人的には、保守性のためにこの場合は無視します。現在のバージョンは、私にとっては読みやすく、保守しやすいです。ここに電話をかけましたが、どちらのバージョンがあなたに適していますか? いずれにしても、パフォーマンスへの影響はほとんどありません。


少し関係があります、パフォーマンスに大きな影響を与えるのは、そのセレクターのキャッシュです
。DOMトラバーサルは非常に高価です。ループの直前にこれを行います:<td>for

var cells = $board.find("td");

cellsループ内で使用すると、同じ要素を再度見つける必要はありません:)

于 2010-08-09T10:26:55.967 に答える
3

したがって、JSLint は次のようなことを懸念していると思います。

for (var i=0; i<10; i++) {
    $("#my-elem" + i.toString()).click(function() { alert(i)});
}

これにより、ID my-elem0 - my-elem9 を持つすべての要素がクリックされたときに "10" を警告します -ループiではなく、含まれている関数にスコープが設定されます。forJSLint は、ループ内で関数を作成しないように指示することで、この問題からユーザーを保護しようとします。each関数が今呼び出され、後で呼び出されることを知るのは賢明ではありません。

于 2010-10-01T15:45:31.440 に答える