web-dev-qa-db-ja.com

JSヒント-ループ内で関数を作成しない

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],
            };
        })
    });
}
54
myTD

関数をループの外側に移動し、その参照を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 */
110
James Allardice

ループ内で関数を宣言するのは面倒であり、エラーが発生する可能性があります。代わりに、関数を1回定義してから、ループに入ります。

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)
             });
}
6
Cory Kendall

「ループ内の関数の宣言は面倒でエラーが発生する可能性が高い」と言われますが、ループ内の関数は、たとえばArray.prototype.forEachで直接指示されたものです方法。 Wordの「関数」は、理論的にはすべてのforEach呼び出しで新たに定義することを意味するため、Javascriptエンジンによって毎回実際に定義されるわけではありません

エンジンには命令の「遅延」処理があるため、外側のループについても同じことが言えます。彼らは全体を再定義するつもりはありませんforEach/Map/etc実際に何も変更がなければ、新たな引数を与えるだけです。

このような単純なことやコードコンテキストについて無知だった古代のJSエンジンの時代は、長い間過ぎ去っています。それでも、forEachまたはMapの場合のように、関数がまだ引数として渡せないときに考えられていたこの古代の警告を受け取っています。

0
DDRRSS