2011-11-08 23 views
11

¿Se puede evitar un desbordamiento de pila en javascript utilizando el método setTimeout para llamar a una función en lugar de llamarla directamente? Mi comprensión de setTimeout es que debería iniciar un nuevo callstack. Cuando miro en la pila de llamadas tanto de Chrome como de IE, parece que las llamadas a setTimeout están esperando a que vuelva la llamada a la función.¿Llamar a setTimeout borra la pila de llamadas?

¿Es esto solo una propiedad del depurador o es mi entendimiento defectuoso?

EDITAR

Mientras que las respuestas proporcionadas a continuación son correctos, el problema real que estaba teniendo estaba relacionada con el hecho de que yo estaba llamando a setTimeout (AFunction(), 10), que fue evaluando AFunction de inmediato debido a la soportes. This question me solucionó.

+0

La función pasó a 'setTimeout' no puede ser invocado antes de la función que ha llamado' setTimeout' regresó. Entonces sí, esa función inicia una nueva pila de llamadas. –

Respuesta

12

Puedo confirmar que la pila está despejada.

Considere este escenario:

function a() { 
    b(); 
} 

function b() { 
    c(); 
} 

function c() { 
    debugger; 
    setTimeout(d, 1000); 
} 

function d() { 
    debugger; 
} 

a(); 

Así que hay dos puntos de ruptura - una al principio de la función c, y una al principio de la función d.

Pila en primer punto de interrupción:

  • c()
  • b()
  • un()

Pila en segundo punto de interrupción:

  • d()

Demostración en directo:http://jsfiddle.net/nbf4n/1/

+0

gracias por apuntarme en la dirección correcta, pude resolverlo en función de su respuesta; sin embargo, tengo otra pregunta, vea http://stackoverflow.com/questions/8058996/why-does-calling-settimeout-with-parenthesis- not-start-a-new-callstack –

+0

Si este tipo es correcto, ¿cómo puede su respuesta ser la respuesta correcta? Porque este chico dice que siempre empuja tu devolución de llamada a la cola de devolución de llamada primero, no a la pila y si hay comandos sincrónicos todavía ejecutándose en la pila de llamadas, u otras cosas en la pila tiene que esperar incluso más que los milisegundos especificados . Entonces, no siempre es 1: 1. Esto podría suceder: oye, te di 5 segundos de retraso, ¿por qué vuelves en 7? porque la devolución de llamada tuvo que esperar un poco más. https://youtu.be/8aGhZQkoFbQ?t=782 – PositiveGuy

+0

La demora que especifique mediante el segundo argumento de 'setTimeout' no garantiza que se llame a la devolución de llamada en ese momento específico, verdadero; pero mi respuesta no dice que lo haría. –

4

Las invocaciones asincrónicas, como las de setTimeout, sí generan una nueva pila de llamadas.

No está del todo claro lo que está describiendo cuando dice "Cuando miro en la pila de llamadas de ambos Chrome y IE parece que las llamadas a setTimeout están esperando que la llamada de función regrese". Pero, una cosa que puede hacer es poner un punto de interrupción dentro de una función llamada por setTimeout, y ver que la pila de llamadas esté vacía.

+0

¿Sabes por qué todavía puedo ver toda la pila de llamadas en el depurador? ¿Es porque mis llamadas a funciones de setTimeout usan un cierre para obtener ciertas variables locales? –

+1

@AranMulholland ¿Dónde invocas al depurador? ¿Dentro de la función que se pasa a 'setTimeout'? –

+0

@ ŠimeVidas según la pregunta, solo estoy mirando la pila de llamadas en los depuradores de navegadores (Chrome e IE) –

Cuestiones relacionadas