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

77

JSLint-Site 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 deaktiviert 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
}

Ausgabe von jslint.com:

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 das Scannen des Skripts bei diesem Fehler beendet wird.

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

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

Oleg Yaroshevych
quelle
Können Sie Ihre Frage klären? Beantworten Sie tatsächlich zwei Fragen?
James Wiseman
1
Hört es beim ersten Fehler immer noch auf, wenn Sie das Kontrollkästchen deaktivieren Stop on first error?
David
Diese Seite wird bessere Arbeit leisten -> glat.info/jscheck
vsync
@ Lee Kowalkowski - kopieren Sie einfach Ihren Code dort und führen Sie ihn aus. Ich deklariere Variablen oben, damit sie ignoriert werden. (wie Fenster, $, etc.)
vsync
2
JSHint ist eine gute Wahl.
B Robster

Antworten:

151

Update Juni 2017: Vorbehaltlich der Unterstützung (z. B. wenn Sie in Internet Explorer 10 oder niedriger kein JavaScript ausführen) sollten Sie die Verwendung von let anstelle von var prüfen .

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


Es gibt keinen Weg werde ich lege var i;von einem for(var i=0; ...; i++)an der Spitze meiner Funktionen. Insbesondere, wenn die JavaScript-Spezifikation dies als akzeptable Syntax in forAbschnitt (12.6) vorsieht. Es ist auch die Syntax, die Brendan Eich in seinen Beispielen verwendet.

Die Idee, die Deklaration nach oben zu verschieben, besteht darin, dass sie genauer widerspiegeln soll, was unter der Haube geschieht. Dies wird jedoch nur reflektieren, nicht beeinflussen.

Für mich ist dies eine lächerliche Erwartung für forIterationen. Dies gilt umso mehr, als JSLint die Verarbeitung stoppt, wenn es sie erkennt.

Ob es besser lesbar 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, in der sie verwendet werden, sicherstellt, dass sie nicht versehentlich global gemacht werden (wenn Sie die Schleife in eine andere Funktion verschieben, wird die Iteratorvariable mit verschoben). Dies ist viel einfacher zu warten, als Variablendeklarationen am Anfang von Funktionen zu verwalten.

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

Lee Kowalkowski
quelle
12
Schauen Sie sich auch JSHint an, das teilweise als Reaktion auf solche Dinge in JSLint erstellt wurde. Und sehen Sie diese Diskussion: stackoverflow.com/questions/6803305/…
B Robster
1
Vielen Dank für den Hinweis auf javascriptlint.com/online_lint.php . Ich habe JSLint verwendet, aber es ist schwierig, den sinnlosen Trottel über Fehler zu durchforsten, die nicht einmal Fehler in JSLint sind.
14
Ich bin nicht anderer Meinung als Sie, aber es ist wichtig darauf hinzuweisen, dass Javascript nur Funktionsumfang hat. Es gibt keinen Blockbereich in einer for-Schleife. Obwohl die Variable idarin definiert ist, steht for(var i=0; i<10; i+=1)sie daher für die gesamte Funktion zur Verfügung und wird bei der Initialisierung nach oben gehoben. JSLint ist syntaktisch korrekt, aber in diesem Fall codiert konventionell niemand auf diese Weise.
MastaBlasta
2
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 eine variable already definedWarnung auslösen würde , aber das war nicht der Fall ! Selbst im strengen Modus gab das erneute Deklarieren einer Variablen keine Warnungen oder Fehler aus. Also ja, JSLint ist falsch.
MastaBlasta
2
@Zon: oder einfach iwieder verwenden, wie es jeder vernünftige Entwickler tun würde. Egal wo Sie deklarieren var i, die Wiederverwendung ist unabhängig davon zulässig.
Lee Kowalkowski
7

Der Google Closure-Compiler erkennt den Typ der Schleifenvariablen einer for ... in-Schleife nur dann korrekt, wenn sie wie for (var i in ...) deklariert ist und keine Annotation dies zu beheben scheint, sodass die Deklaration nicht verschoben werden kann nach oben.

jjrv
quelle
Ja wirklich?! Das ist schade, aber sehr nützlich zu teilen, +1.
Lee Kowalkowski
@jjrv Haben Sie ein Beispiel für Code, der mit dem Closure Compiler nicht funktioniert? Ich benutze es und habe keine Probleme gesehen.
JavaKungFu
@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
Oh OK, ich habe Ihre Antwort falsch verstanden. Ich dachte, sie hat tatsächlich ein Problem im kompilierten Code verursacht. Vielen Dank.
JavaKungFu
5

Sie können jederzeit ältere Versionen herunterladen oder die neueste Version ändern . Es ist wirklich nicht so schwer (Suche nach move_var). Führen Sie dann jslint lokal aus, entweder mithilfe eines Knotens oder mithilfe eines Browsers mit einem einfachen HTML-Formular. Möglicherweise möchten Sie das Original von Crockford kopieren.

Beachten Sie, dass die Warnung im Rahmen einer umfassenden Umschreibung eingeführt wurde und erst danach erfolgt for(, sodass die Meldung etwas irreführend ist.

user123444555621
quelle
3

Ich hatte dieses Problem in 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, dass die eleganteste Lösung darin bestand, underscore.js zu verwenden und statt der vollständigen ausführlichen Schleife die Funktion _.each () zu verwenden, die den JSLint-Fehler beseitigte und unseren Code funktionaler, sauberer, enger und einfacher machte lesen.

Simon Kenyon Shepard
quelle
1

Obwohl die neue Beta- JSLint keine Kommentaranweisung für Mehrfachtoleranz varinnerhalb einer Funktion dokumentiert , scheint sie die Anweisungen aus der Originalversion zu unterstützen.

Mit der ursprünglichen JSLint konnten Sie dies tun:

/*jslint vars: true */

Nach meiner Erfahrung funktioniert dies immer noch - ich nehme an, um die Abwärtskompatibilität zu gewährleisten. Die Zeit dieses Schreibens ist Juni 2015.

Peter
quelle
0

Ich habe festgestellt, dass der Fehler durch die folgende Syntax behoben wird:

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
}
Gio
quelle