2010-10-26 14 views
19

Especialmente con objetos, no entiendo qué partes del objeto se ejecutan antes de la inicialización, qué se ejecuta en la inicialización y qué se ejecuta en algún momento posterior.En JavaScript, ¿qué código se ejecuta en tiempo de ejecución y qué código se ejecuta en parsetime?

EDITAR: Parece que parsetime es la palabra incorrecta. Creo que debería haber formulado la pregunta "En la lectura de 2 pases, ¿qué se lee en el primer pase y qué se lee en el segundo pase?"

+0

Depende de su código. – SLaks

+1

Cuando pregunta por Javascript, ¿se refiere específicamente a que se usa en un entorno de navegador web? – Spudley

+0

@Spudley, no sabía que podría usarse en cualquier otro entorno, así que sí. – randomable

Respuesta

2

A diferencia de C++, no es posible ejecutar la lógica en el analizador de Javascript.

Sospecho que usted está preguntando qué código se ejecuta inmediatamente y qué código se ejecuta cuando crea cada instancia de objeto.

La respuesta es que cualquier código en una función que llame solo se ejecutará cuando llame a la función, mientras que cualquier código fuera de una función se ejecutará inmediatamente.

+0

¿Hay alguna manera de hacer una función en un objeto que se ejecuta cuando el objeto se inicializa? – randomable

+0

@Randomable: ¿Qué tipo de objeto? Puede llamar a la función en el constructor. – SLaks

+0

Bien, ¿así que tienes que llamarlo? No hay sintaxis para crear una función que lo haga funcionar automáticamente? Creo que sin querer respondiste mi pregunta en ese momento. – randomable

3

Si bien el antecesor directo de JavaScript es Scheme, JavaScript no heredó macros, por lo que la respuesta es bastante simple: nunca ningún código se ejecuta durante el tiempo de análisis.

+0

¿No te refieres a "Self", no "Scheme"? Ahí es de donde obtuvo la herencia prototípica. Realmente no obtuvo mucho de Scheme. – Pointy

25

Un archivo javascript se ejecuta en una lectura de 2 pasos. El primer paso analiza la sintaxis y recopila definiciones de funciones, y el segundo pase realmente ejecuta el código. Esto se puede ver observando que el siguiente código funciona:

foo(); 

function foo() { 
    return 5; 
} 

pero el siguiente no lo hace

foo(); // ReferenceError: foo is not defined 

foo = function() { 
    return 5; 
} 

Sin embargo, esto no es realmente útil saber, ya que no hay ninguna ejecución en el primer pase. No puede hacer uso de esta función para cambiar su lógica en absoluto.

+3

Es muy útil saberlo, porque podría haber escrito fácilmente el código en su segundo ejemplo y no haber entendido por qué no funcionó. Además, no me di cuenta de que no hubo ejecución durante el primer pase, por lo que definitivamente estás aclarando cosas para mí. – randomable

+0

@Gareth - ¿qué pasa con var foo = function() {return 5;}) // undefined no es una función? –

+0

@GalMargalit No, obtendrá un error de sintaxis (paréntesis extra). Si está hablando de un IIFE, obtendrá un error indefinido. Esto también se ejecuta en tiempo de ejecución. – GuyT

4

No estoy seguro de lo que preguntas exactamente, así que solo compartiré lo que sé.

Las funciones de JavaScript se "precargan" y se almacenan en la memoria del navegador, lo que significa que cuando se tiene una función declarada al final de la página y el código la llama desde el principio, funcionará.

Tenga en cuenta que las variables globales, es decir, cualquier variable asignada fuera de una función, no están precargadas, por lo que solo pueden utilizarse después de haber sido declaradas.

Todos los comandos fuera de una función se analizarán en el orden en que aparecen.

JavaScript realmente no tiene "tiempo de ejecución", solo puede responder a eventos o tener código ejecutado a través de temporizadores globales. Cualquier otro código será analizado y "olvidado".

+0

'Las variables globales de JavaScript, es decir, cualquier variable asignada fuera de una función, también están precargadas y pueden ser usadas por código en cualquier parte de la página. podemos usarlo antes de que se inicialice, la forma en que usamos las funciones de tiempo de análisis es decir' función foo() {} '? Creo que no ... las variables globales solo pueden usarse después de su inicialización. esto no funcionará 'console.log (a); var a = 20; ' –

+0

@LalZada hmm ... Creo que lo revisé al escribir esto, lo volveré a probar pronto. –

+0

@LalZada bueno, eso es vergonzoso ... o JS ha cambiado, o publiqué esto sin verificar primero. Editado, ¡gracias por el aviso! :) –

Cuestiones relacionadas