4

我正在使用一个 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 {}

这个 JSLint 是提供它的样式警告之一,还是更严重?
基本上,我最好解决这个问题吗?

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

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范围仅限于包含函数,而不是for循环。JSLint 试图通过告诉您不要在循环中创建函数来保护您免受这种情况的影响。each知道现在而不是以后会调用您的函数还不够聪明。

于 2010-10-01T15:45:31.440 回答