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

时间:2012-10-26 07:03:15

标签: 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],
            };
        })
    });
}

3 个答案:

答案 0 :(得分:109)

您可以在循环外部移动该函数,并将对它的引用传递给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 */

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

答案 2 :(得分:-1)

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

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

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