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/
javascript
jslint
Oleg Yaroshevych
quelle
quelle
Stop on first error
?Antworten:
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 einemfor(var i=0; ...; i++)
an der Spitze meiner Funktionen. Insbesondere, wenn die JavaScript-Spezifikation dies als akzeptable Syntax infor
Abschnitt (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
for
Iterationen. 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.
quelle
i
darin definiert ist, stehtfor(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.for(var i=0; i<5; i+=1)
, wenn der Compiler einevariable already defined
Warnung 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.i
wieder verwenden, wie es jeder vernünftige Entwickler tun würde. Egal wo Sie deklarierenvar i
, die Wiederverwendung ist unabhängig davon zulässig.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.
quelle
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.quelle
Beachten Sie, dass sich das Verschieben aller Variablen nach oben von "Erlaube eine var-Anweisung pro Funktion" unterscheidet. Die Anforderung, alle Variablen nach oben zu verschieben, ist neu und scheint keinen Schalter zu haben. Weitere Informationen finden Sie unter http://groups.google.com/group/jsmentors/browse_thread/thread/5e90c25230f8e22/70e1a95a20fb829e
quelle
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.
quelle
Obwohl die neue Beta- JSLint keine Kommentaranweisung für Mehrfachtoleranz
var
innerhalb 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.
quelle
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 }
quelle