我正在使用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警告存在的原因都是有用的(我想知道它是否实用或风格)。
答案 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
现在会调用你的函数,而不是稍后调用它是不够聪明的。