JSLint: Verwenden einer Funktion vor dem definierten Fehler

74

Ich verwende JSLint, um die meisten meiner externen Javascript-Dateien zu überprüfen. Die meisten Fehler treten jedoch bei Funktionen auf, die verwendet werden, bevor sie definiert werden.

Ist das wirklich ein Problem, über das ich mir Sorgen machen sollte ?

Es scheint, dass Firefox, IE7 und Chrome sich nicht darum kümmern. Funktionen wie die populären init()(die ich oft benutze) bleiben normalerweise oben, da dies für mich sinnvoll ist (ich tue gerne so, als wäre es analog zu main()), müssen laut JSLint an den unteren Rand der Datei verschoben werden.

Chris S.
quelle

Antworten:

69

Wenn Sie Funktionen mit dem functionSchlüsselwort deklarieren, können Sie sie verwenden, bevor sie deklariert werden. Wenn Sie eine Funktion jedoch über eine andere Methode deklarieren (z. B. mithilfe eines Funktionsausdrucks oder des FunctionKonstruktors), müssen Sie die Funktion deklarieren, bevor Sie sie verwenden. Weitere Informationen finden Sie auf dieser Seite im Mozilla Developer Network.

Angenommen, Sie deklarieren alle Ihre Funktionen mit dem functionSchlüsselwort, dann wird dies meiner Meinung nach zu einer Frage im Programmierstil. Persönlich ziehe ich es vor, meine Funktionen so zu strukturieren, dass sie logisch erscheinen und der Code so lesbar wie möglich ist. Zum Beispiel würde ich wie Sie eine initFunktion an die Spitze setzen, weil hier alles beginnt.

Steve Harrison
quelle
2
Ich bevorzuge auch die Init-Methode. Die Funktionen, die es verwendet, gehen weiter unten. Wie kann ich diesen Fehler ignorieren oder hacken, da er mich daran hindert, die nächsten JsLint-Fehler im Code zu sehen? Ich möchte einen allgemeinen Ansatz, um meinen Stil beizubehalten, sehe diesen Fehler jedoch nicht.
Zon
85

Da dies der am besten bewertete Google-Treffer ist und andere Personen ihn möglicherweise zuerst im jslint-Tool nicht sehen, gibt es eine Option namens "Fehlgeordnete Definitionen tolerieren", mit der Sie diese Art von Fehler ausblenden können.

/*jslint latedef:false*/
kontur
quelle
5
Das Setzen dieser Option auf truescheint dieses Problem für mich nicht zu "lösen".
Markus Amalthea Magnuson
Ich habe das gleiche Problem wie Markus.
M. Herold
Könnten Sie Ihr Javascript teilen? @ M.Herold
kontur
4
@ PeterMajeed Nein, das ist es nicht. Chris fragt nicht, wie er falsch geordnete Definitionen tolerieren soll.
Borisdiakur
33

Wenn Sie jshint verwenden können Sie einstellen , latedefauf nofunc, die erst spät Funktionsdefinitionen ignoriert.

Dokumentation - http://www.jshint.com/docs/options/#latedef

Anwendungsbeispiel:

/* jshint latedef:nofunc */

noop();

function noop() {}

Hoffe das hilft.

Jan Molak
quelle
Dies ist die Lösung von 2014.
Hozuki
2
Ist diese Lösung nur für jshint? Ich benutze "Brackets" und bekomme viele Flusenwarnungen. Sollten Flusen mit dieser Hinweislösung kompatibel sein. Ich habe es nicht zum Laufen gebracht.
Andreas Jansson
11

Auf der Website von jslint ( http://www.jslint.com/lint.html ) können Sie Informationen zu einer / * global * / -Direktive lesen, mit der Sie Variablen festlegen können, von denen angenommen wird, dass sie an anderer Stelle deklariert sind.

Hier ist ein Beispiel (setzen Sie dieses oben in die Datei):

/*global var1,var2,var3,var4,var5*/

Das: true: false wird aus meiner Erfahrung eigentlich nicht benötigt, aber es sieht so aus, als würde es von dem empfohlen, was ich auf der Website gelesen habe.

Stellen Sie sicher, dass sich die anfängliche globale Anweisung in derselben Zeile befindet wie /*, da sie sonst unterbrochen wird.

Stanton
quelle
3
Auch für mich muss das Wort global direkt nach dem Sternchen stehen, ohne Leerzeichen, sonst wird es ignoriert.
Carl Pritchett
2

Fügen Sie diese Warnung jshintin Ihre .jshintrcDatei ein, um diese Warnung für alle Dateien zu deaktivieren :

{
   "latedef": false
}
Dmitri Zaitsev
quelle
2

Stellen Sie in Ihrer .jshintrcDatei Folgendes ein:

  "latedef": "nofunc",
Elche
quelle
1

Es ist sehr bedauerlich, dass die Latedef-Option entfernt wurde. Dies ist wichtig, wenn Sie versuchen, eine 'Klasse' mit einer Schnittstelle oben zu erstellen, d. H.

function SomeClass() {
   var self = this;
   self.func = func;

   function func {
      ...
   }
}

Dieser Stil ist sehr verbreitet, besteht jedoch nicht an jsLint, da func vor der Definition "verwendet" wird. Die Verwendung von global für jede 'Member'-Funktion ist ein totaler Schmerz.

Kofifus
quelle
0

Sie können die störende Funktion immer oben deklarieren

zB: var init;

.... aber dann musst du das "var" entfernen, wenn du weiter unten zur wahren Definition kommst:

init = function () {};

jcsubmit
quelle
2
Warnung: init = function(){} ist nicht dasselbe wie function init() {}ECMAScript hat unterschiedliche Regeln für anonyme Funktionen, das ist das erste.
Ron Wertlen