Frage

function First () {
setTimeout("Second()", 50)
};

function Second () {  //I'm very confident this conditional works fine
 if  (document.getElementsByClassName("l")[0].href ==
      document.getElementById("myFrame").getAttribute("src"))  
   {  
   First();                                       
   }
 else
   {
   var newLink = document.getElementsByClassName("l")[0].href;        //
   document.getElementById("myFrame").setAttribute("src", newLink);
   }};

First ();

Das Problem ist, dass, wenn First () definiert ist, ich den Fehler, dass Second nicht definiert ist. Wie kann dieses Problem gelöst werden?

War es hilfreich?

Lösung

Aktualisieren

Ihr aktualisierte Code ist ganz anders von Ihrem ursprünglichen Code. Das Problem scheint die Zeichenfolge Sie vorbei an setTimeout zu sein (was mich überraschte, war aber leicht repliziert). Ich würde ändern

function First () {
    setTimeout("Second()", 50)
};

function First () {
    setTimeout(Second, 50);
}

... oder wenn Sie Parameter Second weitergeben müssen:

function First() {
    setTimeout(function() {
        Second(param0, param1);
    }, 50);
}

(Beachten Sie, dass es keine Notwendigkeit für eine ; am Ende einer Funktion Erklärung, sondern ein nach dem setTimeout nicht geht nicht in Ordnung wäre [Sie nicht wirklich Notwendigkeit es, das Grauen, das ist "Semikolon insertion" wird es für Sie in diesem Fall einfügen, aber ...].)

Die zweite und dritte Ausführungen über die Verwendung einer Funktionsreferenz. Ihre ursprünglichen Verwendungen eine Zeichenkette, die dann kompiliert wird, was nicht notwendig ist, und scheint das Problem zu sein (wie dieses Beispiel mit dem String nicht , aber diese mit der Funktion Nachschlagewerke ).

Original Antwort

Wie die Antwort unten, wird der Code in Frage zitiert wurde:

function First() {Second();};
function Second() {First();};

wird Dieser Code gut funktionieren. Es ist eine unendliche Schleife (na ja, nicht unendlich , weil schließlich die Umsetzung wird nicht mehr Stapelspeicherplatz für die Rückkehr-Adressen hat), aber bis es explodiert wegen, dass es dann gut funktionieren. Beispiel

Es wird scheitern, wenn Ihre ist Code sieht mehr wie folgt aus:

var First = function() {
    Second();
};
First();
var Second = function() {
    First();
};

... denn das ist sehr unterschiedlich ist, verwendet es Funktion Ausdrücke (die als Teil des Schritt-für-Schritt-Code verarbeitet werden), anstatt Funktion Erklärungen (die beim Eintritt in den Rahmen verarbeitet werden, bevor ein Schritt-für-Schritt-Code) und es einen Aufruf an First muss, bevor Second definiert ist. Siehe diese andere Antwort hier auf Stackoverflow für weitere Einzelheiten über die Unterscheidung zwischen ein Funktionsausdruck und eine Funktionsdeklaration.

Andere Tipps

Ok, ich glaube, ich Ihr Problem. Ich wette, Ihr Code innerhalb einer Funktion gewickelt, nicht wahr? Dann gäbe es nicht so etwas wie Funktion Zweiter sein.

Das wird nicht funktionieren:

(function() {
    function First () {
        setTimeout("Second()", 50)
    }
    function Second () {
        alert('hi!');
    }
    First();
})();

Aber das funktioniert:

(function() {
    function First () {
        setTimeout(Second, 50)
    }
    function Second () {
        alert('hi!');
    }
    First();
})();

ich Ihren Code gerade versucht und als "Second ();" zuerst. Es funktionierte gut in Chrome. Es wird Schleife für immer natürlich.

In Javascript Variablen ist sehr spät in dem Aufruf einer Funktion gebunden. Das globale Objekt ist auch nur eine weitere Variable, die auch als „gebunden“ ist sehr spät. Alles kann jederzeit (asynchron) ändern, ist, warum eine Funktion darf nicht verlangen, dass eine weitere Funktion zur Verfügung steht. Die „fehlende“ Funktion könnte nur durch einen anderen Mechanismus hinzugefügt werden, kurz bevor die Funktion aufgerufen wird. Erst kurz vor einer Funktion ausgeführt wird, sollte die JS-Laufzeit überprüfen, ob diese Funktionen im Rahmen verfügbar ist.

Das ist, warum es funktioniert in Chrome. In Javascript machst du eigentlich so etwas wie folgt aus:

var GLOB = this; // bind global obj to variable

GLOB["First"] = function() {
   GLOB["Second"]();
};

GLOB["Second"] = function() {
   GLOB["First"]();
};

Hervorrufen GLOB["Second"](); wirkt wie ein Zauber in Chrome (und es Schleifen natürlich). vielleicht Ihr Browser / JS-Implementierung / dev-Tool ist restriktiver in Bezug auf Funktionsdefinitionen, und die können Sie nicht Funktionen verwenden, bevor sie definiert sind.

Dann können Sie diese obj["funcname"] = function() {} Syntax verwenden, die die gleichen wie function funcname(){} tut, aber vielleicht nicht so Fehler von Ihren „gebrochen“ JS-Interpreter erkannt werden.

Ich hoffe, das hilft, Juve

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