JSLint-Fehler: Verschieben Sie alle „var“-Deklarationen an den Anfang der Funktion

Lesezeit: 6 Minuten

Benutzer-Avatar
Oleg Jaroschewitsch

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

Weiß jemand, wie man diesen Fehler ausschaltet 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:

Variablen über den Funktionen zu haben, ist eine neue Anforderung. Ich kann JSLINT nicht zum Testen von Code verwenden, da es das Scannen des Skripts bei diesem Fehler stoppt.

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

UPDATE 22.08.2011: gefunden http://jshint.comes sieht viel besser aus als http://jslint.com/

  • Können Sie Ihre Frage präzisieren. Stellen Sie eigentlich zwei Fragen?

    – James Weisemann

    10. Januar 2011 um 12:15 Uhr

  • Hält es immer noch beim ersten Fehler an, wenn Sie das Häkchen entfernen Stop on first error?

    – david

    1. Februar 2011 um 22:11 Uhr

  • Diese Seite wird es besser machen -> glat.info/jscheck

    – vsync

    25. Juni 2011 um 14:33 Uhr

  • @Lee Kowalkowski – kopieren Sie einfach Ihren Code dorthin und führen Sie ihn aus. Ich deklariere Variablen oben, damit sie ignoriert werden. (wie Fenster, $ usw.)

    – vsync

    1. Oktober 2011 um 17:29 Uhr

  • JSHint ist eine gute Wahl.

    – B Robster

    22. Juni 2012 um 15:39 Uhr

Benutzer-Avatar
Lee Kowalkowski

Aktualisierung Juni 2017: Abhängig von der Unterstützung (z. B. wenn Sie JavaScript nicht in Internet Explorer 10 oder niedriger ausführen), sollten Sie die Verwendung prüfen Lassen Anstatt von Var.

Zum Beispiel: for(let i=0; ...; i++)


Es gibt keine Möglichkeit, die ich setzen werde var i; von einem for(var i=0; ...; i++) an der Spitze meiner Funktionen. Besonders wenn Die JavaScript-Spezifikation hat es als akzeptable Syntax in der for Abschnitt (12.6). Außerdem ist es die Syntax Brenda Eich in seinen Beispielen verwendet.

Die Idee, die Deklaration nach oben zu verschieben, ist, dass sie genauer widerspiegeln soll, was unter der Haube passiert, dies jedoch nur widerspiegelt, nicht beeinflusst.

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

Ob es lesbarer ist, Variablen am Anfang einer Funktion zu deklarieren, ist umstritten. Ich persönlich bevorzuge es, Iteratorvariablen zu deklarieren, wenn sie verwendet 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 das Deklarieren einer Iteratorvariablen dort, wo sie verwendet werden, sicherstellt, dass sie nicht versehentlich global gemacht werden (wenn Sie die Schleife in eine andere Funktion verschieben, bewegt sich die Iteratorvariable mit). Dies ist viel wartungsfreundlicher, als Variablendeklarationen am Anfang von Funktionen verwalten zu müssen.

Im Moment verwende ich http://www.javascriptlint.com/online_lint.php weil es sich auf das Wesentliche zu konzentrieren scheint.

  • Schauen Sie sich auch JSHint an, das teilweise als Reaktion auf solche Dinge in JSLint erstellt wurde. Und siehe diese Diskussion: stackoverflow.com/questions/6803305/…

    – B Robster

    22. Juni 2012 um 15:25 Uhr


  • Danke für den Hinweis javascriptlint.com/online_lint.php. Ich hatte JSLint verwendet, aber es ist schwer, sich durch all das sinnlose Geschwätz über Fehler zu wühlen, die nicht einmal Fehler in JSLint sind.

    Benutzer1052335

    21. September 2012 um 14:15 Uhr

  • Ich widerspreche Ihnen nicht, aber es ist wichtig darauf hinzuweisen, dass Javascript nur einen Funktionsumfang hat. Es hat keinen Blockbereich in einer for-Schleife. Daher obwohl die Variable i ist darin definiert for(var i=0; i<10; i+=1) es steht der gesamten Funktion zur Verfügung und wird bei der Initialisierung nach oben gehoben. JSLint ist syntaktisch korrekt, aber in diesem Fall kodiert per Konvention niemand auf diese Weise.

    – mastaBlasta

    18. März 2013 um 13:54 Uhr


  • NVM du hast vollkommen recht. Ich habe getestet, was passieren würde, wenn Sie zwei Schleifen in einer Funktion hätten for(var i=0; i<5; i+=1)wenn der Compiler a werfen würde variable already defined Warnung, aber das tat es nicht! Selbst im strikten Modus hat das erneute Deklarieren einer Variablen keine Warnungen oder Fehler ausgegeben. Also ja, JSLint ist falsch.

    – mastaBlasta

    19. März 2013 um 17:48 Uhr

  • @Zon: oder einfach verwenden i wieder wie jeder vernünftige Entwickler würde. Egal wo Sie deklarieren var iWiederverwendung ist trotzdem erlaubt.

    – Lee Kowalkowski

    9. September 2015 um 13:52 Uhr


Der Google Closure-Compiler erkennt den Typ der Schleifenvariable einer for…in-Schleife tatsächlich nicht richtig, es sei denn, sie ist wie for (var i in …) deklariert und es scheint keine Anmerkung dies zu beheben, sodass die Deklaration nicht verschoben werden kann Zum Seitenanfang.

  • Ach, tatsächlich?! Das ist schade, aber wirklich nützlich zu teilen, +1.

    – Lee Kowalkowski

    13. November 2012 um 21:13 Uhr

  • @jjrv haben Sie ein Codebeispiel, das nicht mit dem Closure-Compiler funktioniert? Ich benutze es und habe keine Probleme gesehen.

    – JavaKungFu

    8. Januar 2013 um 22:32 Uhr

  • @JavaKungFu das Symptom war, dass der Compiler weniger als 100% typisierten Code meldet und eine Warnung anzeigt, wenn Sie reportUnknownTypes = CheckLevel.WARNING in CompilerOptions.java festlegen.

    – jjrv

    9. Januar 2013 um 8:33 Uhr

  • Oh OK, ich habe Ihre Antwort falsch verstanden, ich dachte, sie hätte tatsächlich ein Problem im kompilierten Code verursacht. Vielen Dank.

    – JavaKungFu

    9. Januar 2013 um 15:04 Uhr

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

Beachten Sie, dass die Warnung als Teil von a eingeführt wurde große Umschreibungund tritt erst danach auf for(daher ist die Meldung etwas irreführend.

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

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

Benutzer-Avatar
Peter

Obwohl die Neu Beta JSLint dokumentiert keine Kommentardirektive für mehrere var Toleranz innerhalb einer Funktion, es tut scheinen die Anweisungen der Originalversion zu unterstützen.

Das Original JSLint erlaubte Ihnen, dies zu tun:

/*jslint vars: true */

Nach meiner Erfahrung funktioniert das immer noch – ich nehme an, aus Gründen der Abwärtskompatibilität. Der Zeitpunkt dieses Schreibens ist Juni 2015.

Benutzer-Avatar
Alexis Tyler

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
}

1019280cookie-checkJSLint-Fehler: Verschieben Sie alle „var“-Deklarationen an den Anfang der Funktion

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy