使用jQuery的.each()时,JSLint的循环内函数如何应用?

时间:2010-08-09 09:55:27

标签: jquery jslint

我正在使用jQuery .each()调用,该调用使用匿名函数,来自for循环。 JSLint提出警告“不要在循环中创建函数”。

这是一个来自更大功能的代码片段 - 实质上它正在检查游戏中的每个玩家是否仍然“活着”(在棋盘上至少有一个棋子)。

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 {})< / p>

此JSLint是否提供了其中一个样式警告,还是更严重?
基本上,我最好解决这个问题吗?

我想了解警告的原因,所以任何评论RE警告存在的原因都是有用的(我想知道它是否实用或风格)。

2 个答案:

答案 0 :(得分: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]);
    }
}

应该你?我个人在这种情况下会忽略它,为了可维护性,你当前的版本更容易阅读/维护,给我。你在这里打电话,哪个版本更适合?无论哪种方式都可能对性能影响不大。


相切但相关的位:
对性能产生更大影响的是缓存<td>选择器,DOM遍历非常昂贵。我会在for循环之前执行此操作:

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

在循环中使用cells,不需要再次找到相同的元素:)

答案 1 :(得分:3)

所以,我相信JSLint会关注这样的事情:

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

这会导致所有ID为my-elem0 - my-elem9的元素在单击时发出警告“10” - i的范围限定为包含函数,而不是for循环。 JSLint试图通过告诉你不要在循环中创建函数来保护你。知道each现在会调用你的函数,而不是稍后调用它是不够聪明的。