problème simple de définition de la fonction javascript
-
09-10-2019 - |
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?
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