2012-04-19 17 views
8

Digamos que tengo esta función:Cuando se pausa en una declaración dentro de las herramientas de desarrollo del navegador, ¿cómo finalizar la ejecución inmediatamente después de esa declaración?

function test() { 

    // statements 1 

    statement_X; 

    // statements 2 

} 

Estoy caminando Trough las declaraciones con herramientas dev de tu navegador. Ahora, cuando estoy en pausa en "statement_X", me gustaría terminar la ejecución de la función (no quiero que se ejecute la parte "statements 2" de la función), como si el "statement_X" fuera seguido inmediatamente por una declaración return;.

Sé que Chrome tiene edición de guiones en línea, así que pude agregar manualmente la declaración de devolución después de la instrucción pausada y luego presionar CTRL + S para volver a ejecutar todo, pero también necesito esta característica para IE, así que Estoy esperando una solución general.

La finalización de la ejecución prematura parece una tarea bastante fácil de hacer (para el navegador), por lo que espero que dicha funcionalidad provenga de las herramientas de desarrollo.

enter image description here

+0

¿Está tratando de detener la ejecución de esta función específica o la depuración? – rcdmk

+0

@rcdmk "O la depuración"? ¿Qué quieres decir? O el depurador? No, el depurador no debería verse afectado por esto. (Me gustaría detener la ejecución de la función.) –

+0

Entonces, creo que no tiene suerte con esto, como señaló Manishearth. – rcdmk

Respuesta

2

Probé esto con éxito en IE 9, así que lo estoy publicando aquí como respuesta: al detener en statement_X en el depurador de scripts, presione F10 para que statement_X se siga ejecutando, luego haga clic derecho en la última línea del adjunto función (la línea con el corchete derecho } que termina el cuerpo de la función), y seleccione "Establecer declaración siguiente" en el menú desplegable. Esto omitirá la ejecución hasta el final de la función como si hubiera una declaración de devolución nula justo después de statement_X.

Si hay otras declaraciones en la última línea de una función, como se muestra en el código siguiente, tenga cuidado al botón derecho del ratón justo en el corchete para que esta técnica funcione.

function test() { alert("statement 1"); 
    alert("statement 2"); } function test2() { alert("statement 3"); } 

Esto puede ser a veces necesario en el caso de funciones en línea, o en scripts minificados no destinados a la depuración.

+0

Establecer la siguiente declaración? Genial ':)' ¿Qué quieres decir con ese último párrafo? –

+0

@ ŠimeVidas: ¡Vaya! Eso fue realmente rápido y sucio. Solo agregué algunas explicaciones más, debería ser claro ahora. –

+0

@ft Probé tu código y tuve que colocar el símbolo de intercalación * antes * de la llave. Al hacer clic * después de * el corchete resultó en un mensaje emergente de error que decía "No se puede establecer el siguiente enunciado en esta ubicación". Esto tiene sentido porque el área después del corchete no forma parte de la ejecución de la función actual, sino que forma parte del alcance externo que no se está ejecutando. Entonces, siempre y cuando haga clic en el espacio antes de la llave, debería estar bien. –

0

Si he entendido bien, no se puede hacer esto.

Los depuradores (el depurador de Chrome en cualquier caso) están basados ​​en JavaScript.

Estos tipos usan eval() (eventualmente) para ejecutar el Código inyectado. Inspector de arrastre a través de Chrome, parece que el código depurador finalmente llama a esto cuando intenta evaluar algo (creo):

function (evalFunction, object, expression, isEvalOnCallFrame, injectCommandLineAPI) 
{ 
    // Only install command line api object for the time of evaluation. 
    // Surround the expression in with statements to inject our command line API so that 
    // the window object properties still take more precedent than our API functions. 

    try { 
     if (injectCommandLineAPI && inspectedWindow.console) { 
      inspectedWindow.console._commandLineAPI = new CommandLineAPI(this._commandLineAPIImpl, isEvalOnCallFrame ? object : null); 
      expression = "with ((window && window.console && window.console._commandLineAPI) || {}) {\n" + expression + "\n}"; 
     } 
     return evalFunction.call(object, expression); 
    } finally { 
     if (injectCommandLineAPI && inspectedWindow.console) 
      delete inspectedWindow.console._commandLineAPI; 
    } 
} 

evalFunction es sólo un alias para eval().

El problema es que no podemos usar declaraciones de retorno en eval, incluso en código difícil. Siempre le dará SyntaxError: Illegal return statement.

Así que no, no hay declaración de devolución vudú.

+0

Bueno, antes que nada, es posible (en Chrome) inyectar una declaración de devolución justo después de la instrucción pausada, y luego volver a ejecutar el código (presionando CTRL + S). Mencioné esto en mi pregunta, y esto es una especie de lo que estoy buscando. (Idealmente, me gustaría tener un botón conveniente "Terminar" en el depurador, para que no tenga que insertar declaraciones de retorno manualmente y hacer CTRL + S todo el tiempo.) El problema es que quiero esta funcionalidad en IE que no tiene intercambio en caliente (edición de código en línea) ... –

+0

@ Šime parece que es a través de una función nativa. Como el depurador de Chrome es HTML, puedo escribir un userscript para Chrome que agrega un botón. Aunque no estoy seguro Y no está allí en IE. – Manishearth

Cuestiones relacionadas