JSLint behauptet, bestimmte rekursive Funktionsaufrufe seien "außerhalb des Geltungsbereichs"

9

Ich habe ein JavaScript-Snippet mit einem rekursiven Funktionsaufruf:

%Vor%

Dies tut nichts anderes, als sich ein paar Mal selbst anzurufen, aber es läuft.

Wenn Sie die obigen Angaben in JSLint einfügen, wird dieser Fehler angezeigt:

%Vor%

Wenn ich jedoch das folgende Snippet einfüge (mit einer Funktionsdeklaration anstelle von var):

%Vor%

JSLint liebt es, keine Fehler.

Ich weiß, dass es das Ziel von JSLint ist, Bugs in Javascript-Code zu vermeiden. Weiß jemand, warum JSLint denkt, dass das erste schlechtes Javascript ist? Was für einen Bug verhindere ich, indem ich keinen rekursiven Aufruf auf die erste Art mache?

    
Amasa 18.11.2015, 18:22
quelle

2 Antworten

4

Mit beiden Stilarten ist nichts falsch. Soweit ich das beurteilen kann, ist dies eine unangemessene Warnung.

Das Problem scheint zu sein, dass eine Variablendeklaration, die eine Zuweisung enthält, nicht dazu führt, dass JSLint das Vorhandensein des deklarierten Variablennamens im Bereich registriert, bis die gesamte Zuweisung ausgewertet wurde. Das heißt, wenn JSLint var recurse = ... liest, stellt es nicht fest, dass recurse eine deklarierte Variable ist, bis es die rechte Seite der Zuweisung bewertet. In diesem Fall enthält die rechte Seite eine Funktion, die die deklarierte Variable recurse verwendet, aber JSLint wusste noch nichts über die Existenz von recurse , da die gesamte Zuweisung noch nicht analysiert wurde.

Beachten Sie, dass dieser Code genauso funktioniert wie Ihr var -Beispiel, aber keine Warnungen in JSLint:

erzeugt %Vor%

Indem Sie var recurse als separate Anweisung herausziehen, erfährt JSLint zuerst, dass recurse im aktuellen Bereich deklariert ist, und dann analysiert die Zuweisung. Mit Ihrer kombinierten var recurse = ... (was wiederum nicht falsch ist), analysiert JSLint die Zuordnung irrtümlich zuerst und erfährt dann von der Existenz von recurse .

    
apsillers 18.11.2015, 19:06
quelle
0

Wenn Sie die Funktion definieren, ist die Variable recurse noch nicht definiert. Aus diesem Grund gibt JSLint an, dass der Gültigkeitsbereich out ist und behauptet, dass dieser undefiniert sein könnte und dieser Punkt.

    
Pablo Matias Gomez 18.11.2015 18:30
quelle

Tags und Links