Frage

Ich habe eine langwierige JavaScript -Datei, die JSlint übergibt, mit Ausnahme der Fehler "verwendet, bevor es definiert wurde".

Ich habe normale Funktionserklärungen verwendet, wie in ...

function whatever() {do something;}

im Gegensatz zu...

var whatever = function(){do something;};

und in Übereinstimmung mit Steve Harrisons Antwort zu einem früheren Beitrag ...

Angenommen, Sie deklarieren alle Ihre Funktionen mit dem Schlüsselwort der Funktion, ich denke, es wird zu einer Frage im Programmierstil. Persönlich bevorzuge ich es, meine Funktionen auf eine Weise zu strukturieren, die logisch erscheint und den Code so lesbar wie möglich macht. Zum Beispiel, wie Sie, würde ich eine Init -Funktion an die Spitze setzen, weil dort alles beginnt.

... Ich mag es, die Funktionen in einer Reihenfolge zu sehen, die für mich Sinn macht.

Das Skript funktioniert perfekt in den verschiedenen getesteten Browsern (z. B. Firefox, Safari, Mobile Safari, Fennec, dh, Chrome, Midori usw.).

Hier ist das Problem: Ich möchte das Skript in einer iPhone -App verwenden, die mit Titanium erstellt wird, aber sein Compiler bleibt mit "verwendet vor definierten" Fehlern.

Wie kann ich das umgehen?

Dies mag eine dumme Frage sein, aber auch ... wenn Funktionen in einer bestimmten Reihenfolge aufgerufen werden müssen, wie löst man die Frage einer genannten Funktion, die zu der Funktion zurückrufen muss, die sie ursprünglich nannte? Zum Beispiel...

function buildMenu(){
     Display a list of five menu items, each of which calls a function to build the associated screen.
}

function screen1() {
     Display the screen associated with menu item #1.
}

Wenn die Funktionen in Ordnung deklariert werden müssen, function screen1 Müsste vorausgehen function buildMenu. Aber was ist, wenn Screen1 unter bestimmten Bedingungen nicht erstellt werden kann und somit das Menü neu spielt (dh eine Funktion, die technisch gesehen noch nicht deklariert ist)?

Oh ja ... noch eine Frage: Gibt es Websites oder Programme, die die Funktionen automatisch neu Sequenz haben, anstatt den Programmierer manuell zu erfordern?

War es hilfreich?

Lösung

Nein, Ems Antwort ist nicht die richtige Lösung. Versuchen Sie, dieses JavaScript auszuführen:

(function () {
   foo(); // right

   var foo = function () {
     console.log("wrong");
   };

   foo(); // wrong

   function foo() {
     console.log("right");
   }

   foo(); // wrong
}());

Dies liegt daran, dass der Dolmetscher zuerst die Funktionserklärung liest, den Namen erstellen foo Als eine Funktion, die "rechts" druckt, liest dann die var Aussage und stellen Sie fest, dass es bereits einen Namen gibt foo Es wird also übersprungen, eine neue Variable mit dem Wert zu erstellen undefined, wie normalerweise passiert. Dann verarbeitet er den Code line-by-line, der eine Zuordnung zu enthält foo. Die Funktionserklärung wird nicht neu aufgestellt. Vielleicht wird sich dies in Titan anders verhalten, aber versuchen Sie es in Firebug und Sie werden bekommen, was ich habe.

Eine bessere Lösung ist:

var screen1, buildMenu;

screen1 = function () { buildMenu(); };
buildMenu = function () { screen1(); };

Dies wird auch JSlint bestehen und das richtige Verhalten erzeugen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top