62

我无法绕过 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],
            };
        })
    });
}
4

3 回答 3

121

您可以将函数移到循环之外并将对它的引用传递给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)
    });
}

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

/*jshint loopfunc: true */
于 2012-10-26T07:08:42.330 回答
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)
             });
}
于 2012-10-26T07:10:29.947 回答
5

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

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

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

于 2019-02-03T11:10:42.950 回答