Question

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

Le problème est que lors de la première () est définie, je reçois l'erreur que Second n'est pas défini. Comment cela peut-il être résolu?

Était-ce utile?

La solution

Mise à jour

Votre code mis à jour est tout à fait différent de votre code d'origine. Le problème semble être la chaîne vous passez à setTimeout (ce qui m'a surpris, mais a été facilement répliquée). Je changerais

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

à

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

... ou si vous avez besoin de passer des paramètres à Second:

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

(Notez qu'il n'y a pas besoin d'un ; à la fin d'une déclaration de fonction, mais l'un après l'setTimeout ferait pas de mal [vous n'avez pas fait besoin il, l'horreur qui est « insertion de virgule » insérera pour vous dans ce cas, mais ...].)

Les deuxième et troisième versions ci-dessus utilisent une référence de fonction. Vos utilisations originales d'une chaîne de qui est ensuite compilé, ce qui est inutile et semble être le problème (comme cet exemple en utilisant la chaîne échoue , mais celui-ci avec les ouvrages de référence fonction ).

Réponse originale

de la réponse ci-dessous, le code cité dans votre question était:

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

Ce code fonctionne très bien. Il est une boucle infinie (bien, pas infini , parce que finalement la mise en œuvre n'aura pas plus d'espace de pile pour les adresses de retour), mais jusqu'à ce qu'il explose à cause de cela que ça va bien fonctionner. Exemple

Il échouera si votre réelle regarde de code plus comme ceci:

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

... parce que c'est très différent, il utilise la fonction expressions (qui sont traitées dans le cadre du code étape par étape) plutôt que la fonction déclarations (qui sont traités lors de l'entrée à la portée, avant tout code étape par étape) et il a un appel à First avant Second est définie. Voir cette autre réponse ici sur StackOverflow pour plus de détails sur la distinction entre une expression de fonction et une déclaration de fonction.

Autres conseils

Ok, je pense que je vois votre problème. Je parie que votre code enveloppé intérieur d'une fonction, non? Alors il n'y aurait pas une telle chose que la fonction Second.

Cela ne fonctionnera pas:

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

Mais ceci étant:

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

Je viens d'essayer votre code et appelé "Second ();" premier. Il a bien fonctionné dans Chrome. Il bouclera toujours bien sûr.

Dans les variables Javascript sont liés très tard à l'invocation d'une fonction. L'objet global est également à une autre variable qui est également « lié » très tard. Tout peut changer à tout moment (de façon asynchrone) qui est la raison pour laquelle une fonction ne doit pas exiger qu'une autre fonction est disponible. La fonction « manquante » pourrait juste être ajoutée par un autre mécanisme juste avant la fonction est invoquée. Seulement juste avant qu'une fonction est exécutée, la JS-exécution doit vérifier si cette fonction est disponible dans le champ d'application.

Voilà pourquoi cela fonctionne dans Chrome. En Javascript que vous faites réellement quelque chose comme ceci:

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

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

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

Invoquer GLOB["Second"](); fonctionne comme un charme dans Chrome (et boucles bien sûr). peut-être votre outil de dev navigateur / JS-application / est plus restrictive en ce qui concerne les définitions de fonction, et nous allons ne pas utiliser les fonctions avant d'être définies.

Ensuite, vous pouvez utiliser cette syntaxe obj["funcname"] = function() {}, qui fait la même chose que function funcname(){}, mais pourrait ne pas être détecté comme erreur par « cassé » JS-interprète.

J'espère que cette aide, Juve

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top