Pregunta

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

El problema es que cuando se define primero (), me sale el error de que la segunda no está definida. ¿Cómo puede ser resuelto?

¿Fue útil?

Solución

Actualizar

Su código actualizado es bastante diferente de su código original. El problema parece ser la cadena que está pasando a setTimeout (que me sorprendió, pero se replicó con facilidad). Que cambiaría

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

a

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

... o si necesita pasar parámetros a Second:

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

(Tenga en cuenta que no hay necesidad de un ; al final de una declaración de función, pero uno tras setTimeout no estaría mal [que en realidad no necesidad ella, el horror que es "inserción punto y coma" insertará para usted en este caso, pero ...].)

Las versiones segunda y tercera de arriba usan una referencia función. Sus usos originales de una cadena que se compila a continuación, que es innecesario y que parece ser el problema (como este ejemplo utilizando la cadena de falla, pero éste con la función de los trabajos de referencia ).

Respuesta original

A partir de la respuesta a continuación, el código citado en su pregunta fue:

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

Ese código funcionará bien. Es un bucle infinito (bueno, no infinito , porque, al final de la aplicación no tendrá más espacio de pila de direcciones de retorno), pero hasta que explota debido a que va a funcionar bien. Ejemplo

Es un error si sus reales miradas de código de la misma familia:

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

... porque eso es muy diferente, utiliza la función Las expresiones (que son procesados ??como parte del código paso a paso) en lugar de la función declaraciones (que se procesan después de la entrada con el ámbito, antes de cualquier código de paso a paso) y tiene una llamada a First antes se define Second. Ver esta otra respuesta aquí en StackOverflow para más detalles sobre la distinción entre una expresión de función y una declaración de la función.

Otros consejos

Ok, creo que veo su problema. Apuesto a su código envuelto dentro de una función, ¿verdad? Entonces no habría tal cosa como la función de segundo.

Esto no funcionará:

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

Pero este trabajo:

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

Me acaba de intentar su código y llama "Segundo ();" primero. Trabajó muy bien en Chrome. Se hará un bucle para siempre, por supuesto.

Variables en Javascript están obligados a altas horas de la invocación de una función. El objetivo global es también una variable más que también está "ligado" muy tarde. Todo puede cambiar en cualquier momento (de forma asíncrona) es por eso que una función no debe requerir que otra función está disponible. La función "perdido" sólo podría ser añadido por algún otro mecanismo justo antes de que se invoca la función. Sólo poco antes de que se ejecute una función, el JS-tiempo de ejecución debe comprobar si estas funciones están disponibles en el ámbito de aplicación.

Es por eso que funciona en Chrome. En Javascript en realidad se está haciendo algo como esto:

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

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

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

Invocación GLOB["Second"](); funciona como un encanto en Chrome (y se realiza un bucle, por supuesto). tal vez su navegador / JS-implementación / dev-herramienta es más restrictiva en cuanto a la definición de funciones, y vamos a no utilizar las funciones antes de ser definidas.

A continuación, puede utilizar esta sintaxis obj["funcname"] = function() {}, que hace lo mismo que function funcname(){}, pero podría no ser detectado como un error por su "roto" JS-intérprete.

Espero que esta ayuda, Juve

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top