paginas funciona español descargar definicion como caracteristicas javascript browser hoisting

funciona - javascript español



¿Cuántos programas de JavaScript se ejecutan para una sola página web en el navegador? (4)

Dmitry Soshnikov ha respondido a tu pregunta. Cada elemento <script> se ejecuta como un Programa, tal como lo define la especificación ECMAScript. Hay un objeto global que usa cada programa en una sola página. Y eso es realmente todo.

Los programas de JavaScript consisten en declaraciones y declaraciones de funciones. Cuando se ejecuta un programa de JavaScript, estos dos pasos ocurren:

  1. el código es escaneado para declaraciones de funciones, y cada func. la declaración se "ejecuta" (creando un objeto de función) y se crea una referencia con nombre a esa función (para que esta función pueda ser llamada desde una declaración)

  2. las sentencias se ejecutan (evalúan) secuencialmente (como aparecen en el código)

Por eso, esto funciona bien :

<script> foo(); function foo() { return; } </script>

Aunque se llama a la función "foo" antes de que se declare, funciona porque la declaración de la función se evalúa antes de la declaración.

Sin embargo, esto no funciona :

<script> foo(); </script> <script> function foo() { return; } </script>

Se lanzará un ReferenceError ("foo no está definido"). Esto lleva a la conclusión de que cada elemento SCRIPT dentro del código HTML de la página web representa un programa JavaScript separado y cada vez que el analizador HTML encuentra un elemento SCRIPT, ejecuta el programa dentro de ese elemento (y luego una vez que se ejecuta el programa, el analizador se mueve al código HTML que sigue al elemento SCRIPT).

Por otra parte, esto funciona :

<script> function foo() { return; } </script> <script> foo(); </script>

Mi entendimiento aquí es que el objeto Global (que sirve como el objeto Variable en el contexto de ejecución global) existe (y permanece) en todo momento, por lo que el primer programa JavaScript creará el objeto de función y hará una referencia para él, y luego el el segundo programa de JavaScript usará esa referencia para llamar a la función. Por lo tanto, todos los programas de JavaScript (dentro de una sola página web) "usan" el mismo objeto Global, y todos los cambios realizados al objeto Global por un programa JavaScript pueden ser observados por todos los programas JavaScript que se ejecutan posteriormente.

Ahora, nota esto ...

<script> // assuming that foo is not defined foo(); alert(1); </script>

En el caso anterior, la llamada de alerta no se ejecutará , porque la instrucción "foo ()" arroja un ReferenceError (que rompe todo el programa de JavaScript) y, por lo tanto, no se ejecutan todas las declaraciones posteriores.

Sin embargo, en este caso ...

<script> // assuming that foo is not defined foo(); </script> <script> alert(1); </script>

Ahora, la llamada de alerta se ejecuta . El primer programa JavaScript arroja un ReferenceError (y como consecuencia se rompe), pero el segundo programa JavaScript se ejecuta normalmente. Por supuesto, el navegador informará el error (aunque sí ejecutó los siguientes programas de JavaScript, después de que ocurriera el error).

Ahora, mis conclusiones son:

  • cada elemento SCRIPT dentro del código HTML de la página web representa un programa separado de JavaScript. Estos programas se ejecutan inmediatamente cuando el analizador HTML los encuentra.
  • todos los programas de JavaScript dentro de la misma página web "usan" el mismo objeto global. Ese objeto global existe en todo momento (desde el momento en que se busca la página web hasta que se destruye la página web). Los programas de JavaScript pueden manipular el objeto Global, y todos los cambios realizados al objeto Global por un programa de JavaScript se pueden observar en todos los programas JavaScript posteriores.
  • si se rompe un programa de JavaScript (al arrojar un error), eso no impide que se ejecuten los siguientes programas de JavaScript.

Por favor verifica esta publicación y dime si tengo algo mal.

Además, no he encontrado recursos que expliquen los comportamientos mencionados en esta publicación, y supongo que los fabricantes de navegadores deben haber publicado dichos recursos en alguna parte, de modo que si los conoce, proporcione los enlaces a ellos.

¡ACTUALIZAR!

OK, voy a (intentaré) responder mi propia pregunta aquí :) Recibí una respuesta (por correo electrónico) de Dmitry A. Soshnikov (él dirige un blog sobre JavaScript en http://www.dmitrysoshnikov.com/ )

Su opinión sobre este tema es esta: cada bloque SCRIPT contiene código global. Ejecutar cada bloque SCRIPT crea un nuevo contexto de ejecución. Por lo tanto, cada bloque SCRIPT tiene su propio contexto de ejecución, pero todos esos contextos de ejecución comparten el mismo objeto Global.

Los bloques SCRIPT se pueden ver como diferentes "subprogramas" con el mismo estado compartido.

Además, la especificación ECMAScript (3ª edición) establece (capítulo 10): "El código global es texto fuente que se trata como un programa ECMAScript".


El izado de funciones (el proceso que evalúa function instrucciones de function antes del resto de la función) es parte del estándar IIRC de ECMAScript (no puedo encontrar una referencia en este momento, pero recuerdo haber visto discusiones de EMCAScript que lo mencionan). La evaluación de las etiquetas de script es parte del estándar HTML. No especifica que sean "programas separados" en muchas palabras, pero sí dice que los elementos del script se evalúan en el orden en que aparecen en el documento. Es por eso que las funciones en las etiquetas de scripts posteriores no se alzan: el script aún no se ha evaluado. Eso también explica por qué una detención de script no corta las secuencias de comandos posteriores: cuando la secuencia de comandos actual deja de evaluar, se inicia la siguiente.


Otra forma de pensar sobre esto es el alcance pseudo local vs global. Cada declaración SCRIPT tiene un alcance local para sus métodos / funciones actuales, así como acceso al alcance global actual (previamente declarado). Cada vez que se define un método / función en un bloque SCRIPT, luego se agrega al alcance global y es accesible por los bloques SCRIPT después de él.

Además, aquí hay otra referencia del W3C sobre la declaración / manejo / modificación del script:

La modificación dinámica de un documento se puede modelar de la siguiente manera:

  1. Todos los elementos de SCRIPT se evalúan en orden a medida que se carga el documento.
  2. Se evalúan todas las construcciones de script dentro de un elemento SCRIPT dado que genera SGML CDATA. Su texto generado combinado se inserta en el documento en lugar del elemento SCRIPT.
  3. El CDATA generado se vuelve a evaluar.

This es otro buen recurso en la evaluación / declaración de script / función.


Son programas separados, pero modifican un objeto global compartido.