JS提示 - 不要在循环中创建函数

myT*_*yTD 58 javascript jshint

我无法解决JSHint的错误消息.这是我正在使用的循环:

for (i = 0; i < Collection.length; i += 4) {
    data.push({
        items : Collection.slice(i, i + 4).map(function(item) {
            return {
                id: item[0],
                title: item[1],
            };
        })
    });
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*ice 112

您可以在循环外部移动该函数并将其引用传递给map:

function mapCallback(item) {
    return {
        id : item[0],
        title : item[1],
    };
}
for (i = 0; i < Collection.length; i += 4) {
    data.push({
        items: Collection.slice(i, i + 4).map(mapCallback)
    });
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用JSHint指令忽略循环内的函数表达式.只需将其放在相关文件的顶部:

/*jshint loopfunc: true */
Run Code Online (Sandbox Code Playgroud)

  • 如果使用`/*jshint ...*/`注释禁用警告,最安全的做法是将注释保留在该循环块中而不是文件顶部.这样,您不会在文件的其他部分中意外隐藏未来的问题. (19认同)
  • @ Skyrim1警告的原因是为了避免在异步回调(onclick或ajax)中使用`i`时经常遇到的bug.你在这里安全,你可以告诉jshint使用詹姆斯的建议保持安静 (8认同)
  • @moala,我将`/*jshint loopfunc:true*/`作为我的`for`循环中的第一行,警告消失了. (3认同)
  • 如果有人碰巧在SublimeLinter中使用Sublime Text,则可以在Package Settings-&gt; SublimeLinter-&gt; User-Settings中使用“ jshint_options”:{“ loopfunc”:true}更改此设置。 (2认同)
  • /*jshint loopfunc: true */ 无效:/ (2认同)

Cor*_*all 6

在循环中声明函数是混乱的,并且可能容易出错.相反,定义一次函数,然后进入循环.

var objMaker = function(item) {
    return {
        id : item[0],
        title : item[1],
    };
};

for (i = 0; i < Collection.length; i += 4) {
    data.push({
                  items : Collection.slice(i, i + 4).map(objMaker)
             });
}
Run Code Online (Sandbox Code Playgroud)

  • 一些评论可能有助于OP更好地理解 (3认同)
  • "凌乱,可能容易出错"并不能解释*在哪种情况下可能会发生**. (2认同)

DDR*_*RSS 5

人们说“在循环中声明一个函数是混乱的并且可能容易出错”,但是循环中的函数是直接在例如Array.prototype.forEach方法中指示的。仅仅因为“函数”这个词理论上应该意味着在每次forEach调用中重新定义它并不意味着它实际上每次都由 Javascript 引擎定义

外循环也是如此,因为引擎对指令进行“惰性”处理。如果没有真正改变它,他们不会重新定义整个forEach / Map /etc 构造指令,他们只会向它提供新的参数。

古老的 JS 引擎对这些简单的事情以及代码上下文一无所知的时代已经一去不复返了。然而,我们收到了这个古老的警告,它是在函数还不能像forEachMap的情况下那样作为参数传递时构想的。