Jshint: loopfunc & let/const

Erstellt am 15. Feb. 2017  ·  7Kommentare  ·  Quelle: jshint/jshint

Einige Probleme (#1301 und #2225, vielleicht andere) geben an, dass dies behoben wurde, aber 2.9.4 warnt immer noch vor der Funktion in Schleifen mit folgendem:

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);
P2

Hilfreichster Kommentar

Ich werde die Methode von @stevenventimiglia verwenden, meine "anstößige" Funktion mit Inline-Konfigurationen umschließen, die Schleifenfunktion ein- und ausschalten, wo ich weiß, dass mein Code referenziell korrekt ist.

Trotzdem dachte ich, ich würde ein weiteres Beispiel anführen, um hervorzuheben, wo diese Regel einige Lücken aufweist:

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

Die obige Funktion nützt nichts. Wichtig ist jedoch, dass keiner der Werte in der Schleife auf Variablen außerhalb der Schleife verweist. Und doch wirft jshint die Warnung aus:

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

Ich dachte nur, ich würde das Feuer schüren, indem ich darauf hinweist, dass diese Warnung in lexikalischen Situationen aufgerufen werden kann.

Alle 7 Kommentare

Danke für den Bericht! Trotz der Kommentare zu den Themen, auf die Sie verwiesen haben,
kann keine Version von JSHint finden, bei der dieses Verhalten jemals richtig gelockert wurde.

Außerdem: Das letzte Beispiel, das Sie geteilt haben, ist ein Sonderfall, der nicht sein sollte
dürfen:

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

Die Tatsache, dass die i Bindung zufällig einen lexikalischen Bereich hat, ist nicht wirklich
Schützen Sie sich vor dem Fehler loopfunc wurde ursprünglich implementiert, um ihn zu vermeiden.
Autoren und Leser von solchem ​​Code können erwarten, dass jede Funktion ein
dedizierte i Bindung, aber tatsächlich teilen sie alle dieselbe Bindung. Wenn jemand
kann bei diesem Fehler helfen, bitte vergessen Sie nicht, dies zu berücksichtigen
Fall.

Außerdem: Das letzte von Ihnen geteilte Beispiel ist ein Sonderfall, der nicht zulässig sein sollte:

Du hast vollkommen recht... Wie albern von mir... ^__^
Haben wir in Bezug auf das eigentliche Problem eine Erwartung, dass dies implementiert wird?

Im Moment haben wir keine Erwartungen. Du möchtest mithelfen?

Für alle, die darauf stoßen, möchte ich nur sagen: Dieses Problem bleibt in jshint 2.9.5 bestehen.

Der erzeugte Fehlercode ist W083.

@overlookmotel -

Meine Empfehlung ist, entweder /*jshint loopfunc: true */ oben in Ihrer .js-Datei zu platzieren oder "loopfunc" : true, zu Ihren .jshintrc Einstellungen hinzuzufügen. Es behebt das Problem nicht wirklich, aber wenn es nach mehr als 5 Jahren nicht behoben wurde, kann oder wird es in absehbarer Zeit nicht behoben.

Ich werde die Methode von @stevenventimiglia verwenden, meine "anstößige" Funktion mit Inline-Konfigurationen umschließen, die Schleifenfunktion ein- und ausschalten, wo ich weiß, dass mein Code referenziell korrekt ist.

Trotzdem dachte ich, ich würde ein weiteres Beispiel anführen, um hervorzuheben, wo diese Regel einige Lücken aufweist:

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

Die obige Funktion nützt nichts. Wichtig ist jedoch, dass keiner der Werte in der Schleife auf Variablen außerhalb der Schleife verweist. Und doch wirft jshint die Warnung aus:

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

Ich dachte nur, ich würde das Feuer schüren, indem ich darauf hinweist, dass diese Warnung in lexikalischen Situationen aufgerufen werden kann.

@andrew-st-angelo-77media Gute Arbeit, darüber zu berichten. Ich erhalte genau den gleichen Fehler, obwohl meine Funktion keine Variablen mit äußerem Gültigkeitsbereich referenziert. Ich hoffe, das wird erledigt.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen