JavaScript es de un solo subproceso y tiene un modelo de ejecución síncrono. Un solo subproceso significa que se está ejecutando un comando a la vez. Sincrónico significa uno a la vez, es decir, se está ejecutando una línea de código a la vez en el orden en que aparece el código. Entonces, en JavaScript, una cosa está sucediendo a la vez.
Contexto de ejecución
El motor de JavaScript interactúa con otros motores en el navegador. En la pila de ejecución de JavaScript hay un contexto global en la parte inferior y luego, cuando invocamos funciones, el motor de JavaScript crea nuevos contextos de ejecución para las funciones respectivas. Cuando la función llamada sale, su contexto de ejecución aparece de la pila, y luego aparece el siguiente contexto de ejecución, etc.
Por ejemplo
function abc()
{
console.log('abc');
}
function xyz()
{
abc()
console.log('xyz');
}
var one = 1;
xyz();
En el código anterior se creará un contexto de ejecución global y en este contexto var one
se almacenará y su valor será 1 ... cuando se invoque la invocación xyz (), se creará un nuevo contexto de ejecución y si hubiéramos definido alguna variable en la función xyz, esas variables se almacenarían en el contexto de ejecución de xyz (). En la función xyz invocamos abc () y luego se crea el contexto de ejecución abc () y se coloca en la pila de ejecución ... Ahora, cuando abc () termina, su contexto se extrae de la pila, entonces el contexto xyz () se extrae de apilar y luego aparecerá el contexto global ...
Ahora sobre devoluciones de llamada asincrónicas; asíncrono significa más de uno a la vez.
Al igual que la pila de ejecución, está la Cola de eventos . Cuando queremos que se nos notifique sobre algún evento en el motor de JavaScript, podemos escuchar ese evento, y ese evento se coloca en la cola. Por ejemplo, un evento de solicitud Ajax o un evento de solicitud HTTP.
Siempre que la pila de ejecución esté vacía, como se muestra en el ejemplo de código anterior, el motor de JavaScript revisa periódicamente la cola de eventos y ve si hay algún evento sobre el que se deba notificar. Por ejemplo, en la cola hubo dos eventos, una solicitud ajax y una solicitud HTTP. También busca ver si hay una función que deba ejecutarse en ese desencadenador de eventos ... Entonces, el motor de JavaScript recibe una notificación sobre el evento y conoce la función respectiva que se ejecutará en ese evento ... Entonces, el motor de JavaScript invoca el función de controlador, en el caso de ejemplo, por ejemplo, se invocará AjaxHandler () y, como siempre cuando se invoca una función, su contexto de ejecución se coloca en el contexto de ejecución y ahora la ejecución de la función finaliza y la solicitud de evento ajax también se elimina de la cola de eventos ... Cuando AjaxHandler () finaliza, la pila de ejecución está vacía, por lo que el motor vuelve a mirar la cola de eventos y ejecuta la función de controlador de eventos de la solicitud HTTP que fue la siguiente en la cola. Es importante recordar que la cola de eventos se procesa solo cuando la pila de ejecución está vacía.
Por ejemplo, vea el siguiente código que explica la pila de ejecución y el manejo de la cola de eventos mediante el motor Javascript.
function waitfunction() {
var a = 5000 + new Date().getTime();
while (new Date() < a){}
console.log('waitfunction() context will be popped after this line');
}
function clickHandler() {
console.log('click event handler...');
}
document.addEventListener('click', clickHandler);
waitfunction(); //a new context for this function is created and placed on the execution stack
console.log('global context will be popped after this line');
Y
<html>
<head>
</head>
<body>
<script src="program.js"></script>
</body>
</html>
Ahora ejecute la página web y haga clic en la página, y vea el resultado en la consola. La salida será
waitfunction() context will be popped after this line
global context will be emptied after this line
click event handler...
El motor de JavaScript ejecuta el código de forma síncrona como se explica en la parte del contexto de ejecución, el navegador pone las cosas en la cola de eventos de forma asíncrona. Por lo tanto, las funciones que tardan mucho tiempo en completarse pueden interrumpir el manejo de eventos. Las cosas que suceden en un navegador, como los eventos, son manejadas de esta manera por JavaScript, si se supone que un oyente debe ejecutarse, el motor lo ejecutará cuando la pila de ejecución esté vacía. Y los eventos se procesan en el orden en que ocurren, por lo que la parte asincrónica se trata de lo que sucede fuera del motor, es decir, qué debe hacer el motor cuando ocurren esos eventos externos.
Entonces JavaScript es siempre sincrónico.