-Todos los lenguajes de programación son síncronos. Es decir, tienen que ejecutarse tarea por tarea.

-JavaScript procesa las tareas en un solo hilo (single-thread), sin importar si se tiene o no múltiples procesadores.

-Conceptos clave:

*Bloqueante: una tarea no devuelve el control hasta que se ha completado. Ejemplo la función alert() para que siga la ejecución luego de esta, se tiene que cerrar el cuadro que invoca.

*No bloqueante: Una tarea devuelve el control inmediatamente con independencia del resultado. Si se completó, devuelve los datos, sino arroja un error.

*Síncrono: Las tareas se ejecutan de manera secuencial y por ende deben esperar a que se completen para continuar con la siguiente tarea.

*Asíncrono: Las tareas pueden ser realizadas más tarde, por lo que la respuesta puede ser diferida, mientras otras tareas se estén ejecutando durante esa espera.

*Paralelismo: Es la ejecución simultánea de dos o más tareas. Algunas tareas se pueden dividir en partes más pequeñas que pueden ser resueltas simultáneamente.

*Concurrencia: Es la capacidad de un algoritmo o programa para ejecutar más de una tarea a la vez. El concepto es similar al procesamiento paralelo, pero con la posibilidad de que muchos trabajos independientes hagan diferentes cosas a la vez en lugar de ejecutar el mismo trabajo.

-CALLBACKS: Una función es pasada como argumento en otra función.

-PROMESAS (ES6): Son funciones no bloqueantes y asíncronas, las cuales pueden retornar un valor ahora, en el futuro o nunca.

-ASYNC/AWAIT: Permite estructurar una función asincróna sin bloqueo de una manera muy similar a una función sincróica ordinaria.

Con todo lo mencionado se puede definir a JavaScript como un lenguaje asíncrono, y no bloqueante.

MOTOR V8 DE JAVASCRIPT

Event Loop es un comunicador entre el Callstack y la Task Queue. Cuando la CallStack este vacía, pasa las tareas asíncronas listas del TaskQueue para leer la instrucción.

Simulador de V8 aquí.

MÓDULO 1: CALLBACKS

//CALLBACKS: Una función es pasada como argumento en otra función.

//Ejemplo 1

function sum(num1, num2) {
    return num1 + num2;
}

function calc(num1, num2, sumNumbers) { //sumNunbers hace referencia al callback...es un nombre cualquiera
    return sumNumbers(num1, num2);
};

console.log(calc(2, 2, sum)); //4 //se invoca a la función sum sin usar paréntesis porque sino se estaría llamanda a esa función de inmediato y saldría error

//Ejemplo 2

setTimeout(function () {
    console.log('Hola JavaScript');
}, 5000)

function gretting(name) {
    console.log(`Hola ${name}`);
}

setTimeout(gretting, 2000, 'Ricardo'); //si es una función con parámetro, entonces el tercer argumento es el valor de ese parámetro

//Entre los dos setTimeout, se devuelve primero el que acabe primero, en este caso Hola Ricardo y luego Hola JavaScript

//---UTILIDAD---

//Calculadora

const sum = (a, b) => a + b;
const res = (a, b) => a - b;
const mult = (a, b) => a * b;
const div = (a, b) => a / b;
const calc = (a, b, operation) => operation(a, b);
console.log(calc(4, 5, res));

Playground1 - Ejecuta un callback con 2s de demora