Frage JSLint Fehler: Verschieben Sie alle 'var' Deklarationen an den Anfang der Funktion


JSLint-Site aktualisiert, und ich kann JS-Skripts nicht mehr überprüfen. Für mich ist diese Warnung nicht kritisch, und ich möchte nicht durch Tausende von Zeilen gehen, um dies zu beheben, ich möchte kritischere Probleme finden.

Weiß jemand, wie man diesen Fehler abstellt oder Legacy-JSLint verwendet?

AKTUALISIEREN

Beispiel:

function doSomethingWithNodes(nodes){
  this.doSomething();

  for (var i = 0; i < nodes.length; ++i){
    this.doSomethingElse(nodes[i]);
  }

  doSomething(); // want to find this problem
}

jslint.com Ausgabe:

Error:
Problem at line 4 character 8: Move all 'var' declarations to the top of the function.

for (var i = 0; i < nodes.length; ++i){

Problem at line 4 character 8: Stopping, unable to continue. (44% scanned).

Problem:

Es ist eine neue Anforderung, Variablen über den Funktionen zu haben. Ich kann JSLINT nicht zum Testen von Code verwenden, da das Skript bei diesem Fehler nicht mehr überprüft wird.

Ich habe viel Code und möchte diese Warnung nicht als kritischen Fehler ablehnen.

UPDATE 22.8.2011: gefunden http://jshint.comsieht es viel besser aus als http://jslint.com/


76
2018-01-10 11:45


Ursprung


Antworten:


Update Juni 2017: Abhängig von der Unterstützung (z. B. wenn Sie JavaScript in Internet Explorer 10 oder darunter nicht ausführen) sollten Sie sich mit der Verwendung von Lassen Anstatt von var.

Beispielsweise: for(let i=0; ...; i++)


Ich werde es auf keinen Fall tun var i; von einem for(var i=0; ...; i++) an der Spitze meiner Funktionen. Besonders wenn Die JavaScript-Spezifikation hat es als eine akzeptable Syntax in der for Abschnitt (12.6). Außerdem ist es die Syntax Brendan Eich verwendet in seinen Beispielen.

Die Idee, die Deklaration an die Spitze zu bringen, besteht darin, dass sie genauer wiedergeben soll, was unter der Haube passiert, dies jedoch nur reflektieren, nicht beeinflussen wird.

Für mich ist das eine lächerliche Erwartung for Iterationen. Dies umso mehr, als JSLint die Verarbeitung stoppt, wenn sie erkannt wird.

Ob Variablen, die am Anfang einer Funktion deklariert sind, besser lesbar sind, ist fraglich. Ich persönlich bevorzuge Iterator-Variablen, die bei ihrer Verwendung deklariert werden. Es ist mir egal, ob die Variable bereits intern erstellt wurde, ich initialisiere sie hier, damit ich sicher bin.

Ich würde argumentieren, dass die Deklaration einer Iteratorvariablen, wo sie verwendet wird, sicherstellt, dass sie nicht versehentlich global gemacht wird (wenn Sie die Schleife in eine andere Funktion verschieben, bewegt sich die Iteratorvariable mit). Dies ist wesentlich wartungsfreundlicher als die Verwaltung von Variablendeklarationen an der Spitze von Funktionen.

Für den Moment verwende ich http://www.javascriptlint.com/online_lint.php weil es sich auf die wichtigen Dinge zu konzentrieren scheint.


149
2018-06-20 13:12



Der Google Closure-Compiler kann den Typ der Schleifenvariablen einer for ... in-Schleife nicht korrekt erkennen, es sei denn, er wird wie für (var i in ...) deklariert und keine Annotation scheint dies zu beheben, sodass die Deklaration nicht verschoben werden kann Zum Seitenanfang.


7
2018-06-30 15:18



Sie können herunterladen ältere Versionen jederzeit, oder ändern Sie die letzte Version. Es ist nicht so schwer, wirklich (Suche nach move_var). Führen Sie jslint dann lokal aus, indem Sie entweder einen Knoten verwenden oder einen Browser mit einem einfachen HTML-Formular verwenden - Sie möchten vielleicht Crockfords Original kopieren.

Beachten Sie, dass die Warnung als Teil von a eingeführt wurde Hauptumschreibungund tritt nur danach auf for(, also ist die Nachricht ein wenig irreführend.


5
2018-02-01 23:11



Beachten Sie, dass alle vars nach oben verschieben sich von "eine var-Anweisung pro Funktion zulassen" unterscheidet. Die Anforderung, alle Variablen nach oben zu verschieben, ist neu und scheint keinen Wechsel zu haben. Mehr bei http://groups.google.com/group/jsmentors/browse_thread/thread/5e90c25230f8e22/70e1a95a20fb829e


4
2018-02-01 21:46



Ich hatte dieses Problem auf meiner Codebasis, als wir auf die neueste Version von JSLINT wechseln wollten. Wir hatten viele davon und die Leute waren nicht glücklich darüber, die Erklärung zu verschieben. Wir fanden die eleganteste Lösung darin, die Datei "underscore.js" zu verwenden und statt der vollständigen ausführlichen Schleife die Funktion _.each () zu verwenden, die den JSLint-Fehler löste und unseren Code funktioneller, sauberer, straffer und einfacher machte lesen.


3
2017-08-29 10:22



Obwohl die Neu Beta JSLint Dokumentiert keine Kommentar-Direktive für mehrere var Toleranz innerhalb einer Funktion, es tut Scheint, die Richtlinien von der ursprünglichen Version zu unterstützen.

Das Original JSLint erlaubte dir dies zu tun:

/*jslint vars: true */

Nach meiner Erfahrung funktioniert das immer noch - ich nehme an, dass es abwärtskompatibel ist. Die Zeit dieses Schreibens ist Juni 2015.


1
2018-06-09 23:02



Ich habe festgestellt, dass die folgende Syntax den Fehler entfernt:

function doSomethingWithNodes(nodes) {
    this.doSomething();
    var i; // HERE is where you move the 'var' to the top of the function
    for (i = 0; i < nodes.length; ++i) {
        this.doSomethingElse(nodes[i]);
    }

    doSomething(); // want to find this problem
}

0
2018-04-29 03:15