Domanda

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 ();

Il problema è che quando si definisce in primo luogo (), ottengo l'errore che Second non è definito. Come può essere risolto?

È stato utile?

Soluzione

Aggiorna

Il tuo codice aggiornato è molto diverso dal codice originale. Il problema sembra essere la stringa si sta passando a setTimeout (che mi ha sorpreso, ma era facilmente replicato). Cambierei

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

a

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

... o se avete bisogno per passare parametri a Second:

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

(nota che non c'è alcun bisogno di una ; alla fine di una dichiarazione di funzione, ma uno dopo l'setTimeout non guasterebbe [non lo fai davvero necessità di esso, l'orrore che è "inserimento e virgola" inserirà per voi in questo caso, ma ...].)

La seconda e la terza versione sopra usano un riferimento funzione. I suoi usi originali una stringa che viene poi compilato, che è inutile e sembra essere il problema (come questo esempio utilizzando la stringa fallisce , ma questo con la funzione di opere di consultazione ).

risposta originale

A partire dalla risposta qui sotto, il codice citato nella domanda era:

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

Questo codice funzionerà bene. Si tratta di un ciclo infinito (beh, non infinito , perché alla fine l'implementazione non avrà più spazio di stack per gli indirizzi di ritorno), ma fino a quando non fa saltare in aria a causa di quello che sarà funzionare bene. Esempio

Si può riuscire se il effettivamente sguardi di codice più simile a questo:

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

... perché è molto diversa, utilizza la funzione espressioni (che sono trattati come parte del codice passo-passo) anziché funzione dichiarazioni (che vengono elaborati all'entrata allo scopo, prima di qualsiasi codice passo-passo) e ha una chiamata al First prima Second è definito. Vedere quest'altra risposta qui su StackOverflow per maggiori dettagli sulla distinzione tra un'espressione di funzione e di una dichiarazione di funzione.

Altri suggerimenti

Ok, mi sembra di vedere il vostro problema. Scommetto che il codice avvolto all'interno di una funzione, giusto? Poi non ci sarebbe alcuna cosa come funzione di secondo.

Questo non funziona:

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

Ma questo lavoro sarà:

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

Ho appena provato il tuo codice e chiama "Second ();" primo. Ha funzionato bene in Chrome. E 'anello per sempre, naturalmente.

variabili in JavaScript sono tenuti molto tardi invocazione di una funzione. L'oggetto globale è anche solo un'altra variabile che è anche "legato" molto tardi. Tutto può cambiare in qualsiasi momento (in modo asincrono), che è il motivo per cui una funzione non deve richiedere che un'altra funzione è disponibile. La funzione "mancante" potrebbe anche essere aggiunti da un altro meccanismo poco prima che la funzione viene richiamata. Solo poco prima dell'esecuzione di una funzione, il JS-runtime deve verificare se questa funzione è disponibile nel campo di applicazione.

Ecco perché funziona in Chrome. In JavaScript si sta effettivamente facendo qualcosa di simile a questo:

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

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

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

Invocare GLOB["Second"](); funziona come un fascino in Chrome (e loop ovviamente). forse il browser / JS-implementazione / dev-tool è più restrittiva per quanto riguarda le definizioni di funzioni, e cerchiamo di non utilizzare le funzioni prima che siano definite.

Quindi si potrebbe utilizzare questa sintassi obj["funcname"] = function() {}, che fa la stessa come function funcname(){}, ma potrebbe non essere rilevato come errore dal vostro "rotto" JS-interprete.

Spero che questo aiuta, Juve

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top