Jshint: loopfunc&let / const

作成日 2017年02月15日  ·  7コメント  ·  ソース: jshint/jshint

いくつかの問題(#1301と#2225、おそらく他の問題)は、これが解決されたと述べていますが、2.9.4は、ループ内の関数について次のように警告しています。

const a = [], b = [];
for (let i in b) a.push(() => i);
for (let i of b) a.push(() => i);
for (let i = 0; i < 10; i++) a.push(() => i);

let i = 0;
while (i++ < 10) a.push(() => i);

最も参考になるコメント

@stevenventimigliaのメソッドを利用して、「問題のある」関数をインライン構成でラップし、コードが参照的に適切であることがわかっている場合に、loopfuncの寛容さをオンまたはオフにします。

そうは言っても、このルールにいくつかのギャップがある場所を強調するために、もう1つの例を提供すると思いました。

function foo(myLoopArr)
{
    /* globals Promise: false */
    for(let val in myLoopArr)
    {
        const myPromArr = [];
        myPromArr.push(function() {
            return new Promise();
        });
    }
}

上記の関数は何の役にも立ちません。 ただし、重要なのは、ループ内のどの値もループ外の変数を参照していないことです。 それでも、jshintは警告をスローします:

 myPromArr.push(function() {
                                ^ Functions declared within loops referencing an outer scoped variable may lead to confusing semantics.

この警告は字句的に健全な状況で呼び出される可能性があることを指摘して、私が火をつけたと思っただけです。

全てのコメント7件

報告ありがとうございます! あなたが参照した問題についてのコメントにもかかわらず、私は
この動作は、これまで適切に緩和されたJSHintのバージョンを見つけることができません。

また、あなたが共有した最後の例は、あるべきではない特別なケースです
許可された:

let i = 0;
while (i++ < 10) a.push(() => i);

iバインディングがたまたま字句スコープであるという事実は、実際にはそうではありません
間違いから保護するloopfuncは元々回避するために実装されました。
そのようなコードの作成者と読者は、各関数に
専用のiバインディングですが、実際には、それらはすべて同じバインディングを共有しています。 誰かが
はこのバグを解決することができます、それを説明することを忘れないでください
場合。

また、共有した最後の例は、許可されるべきではない特殊なケースです。

あなたは完全に正しいです...私はなんてばかげています... ^ __ ^
実際の問題について、これが実装されることを期待していますか?

現時点では期待はしていません。 手伝ってみませんか?

これに遭遇した人のために言うと、この問題はjshint2.9.5に残っています。

生成されるエラーコードはW083です。

@overlookmotel -

.jsファイルの先頭に/*jshint loopfunc: true */を配置するか、 .jshintrc設定に"loopfunc" : true,を追加することをお勧めします。 それは実際には問題を解決しませんが、5年以上経過しても解決されない場合は、すぐに対処できる、または対処される予定の問題ではありません。

@stevenventimigliaのメソッドを利用して、「問題のある」関数をインライン構成でラップし、コードが参照的に適切であることがわかっている場合に、loopfuncの寛容さをオンまたはオフにします。

そうは言っても、このルールにいくつかのギャップがある場所を強調するために、もう1つの例を提供すると思いました。

function foo(myLoopArr)
{
    /* globals Promise: false */
    for(let val in myLoopArr)
    {
        const myPromArr = [];
        myPromArr.push(function() {
            return new Promise();
        });
    }
}

上記の関数は何の役にも立ちません。 ただし、重要なのは、ループ内のどの値もループ外の変数を参照していないことです。 それでも、jshintは警告をスローします:

 myPromArr.push(function() {
                                ^ Functions declared within loops referencing an outer scoped variable may lead to confusing semantics.

この警告は字句的に健全な状況で呼び出される可能性があることを指摘して、私が火をつけたと思っただけです。

@ andrew-st-angelo-77mediaそれを報告する良い仕事。 関数が外部スコープの変数を参照していなくても、まったく同じエラーが発生します。 これがお世話になることを願っています。

このページは役に立ちましたか?
0 / 5 - 0 評価