Estoy tratando de entender a fondo las devoluciones de llamadas y esta es la pieza fundamental que falta. Busqué en Internet esta respuesta, pero la mayoría solo habla de devoluciones de llamada asíncronas.
P 1: ¿Por qué algunos métodos integrados como
Array.prototype.forEach()usansynchronous callbacks? ¿Qué ventaja proporciona esta función?
P 2: ¿Cómo decidimos que es hora de usar una devolución de llamada síncrona al implementar nuestros propios métodos personalizados?
Fondo:
El bucle for of de javascript funcionalmente hace exactamente lo mismo que su contraparte forEach() cuando se habla de matrices. Ambos hacen un bucle desde el frente hasta el final de la matriz. Entonces, ¿por qué necesitamos ambos?
Dos diferencias obvias (en general) que veo son:
continue y break , forEach() noforEach() usa una synchronous callback .Veo la importancia de los puntos 1 y 2, pero no entiendo el punto 3
P: ¿Qué ventaja ofrece forEach() al tomar una devolución de llamada
synchronouscomo argumento?
Una respuesta que no sea "nos permite aplicar una función a cada elemento" o nos permite "abstraer la lógica" sería realmente útil a menos que las respuestas sean realmente así de obvias y estoy pensando demasiado en esto.
Espero que mi pregunta sea inequívoca y súper clara.
Las devoluciones de llamada no son inherentemente síncronas o asíncronas. Una devolución de llamada es solo una función que se proporcionó como argumento a otra función.
Cuando se llama a esa devolución de llamada, está funcionando y, por lo general, algún otro evento lo precede. Si ese evento es en sí mismo asíncrono, entonces la llamada también es asíncrona.
Esto es completamente independiente de forEach y a for . La razón por la que ambos existen, es probablemente una combinación de lo siguiente:
for(.. of ..) no existió durante mucho tiempo, y for(.. in ..) tiene un comportamiento sorprendente relacionado con los prototipos. Esto llevó a que muchas bibliotecas implementaran un (for)each funcional, sobre todo jQuery.each , es porque mucha gente se confundió sobre cómo se comportaban las variables en alcance/cierres y bucles. Hacer una versión funcional hace que sea mucho más fácil no sobrescribir las variables de cierre para iteraciones anteriores. Especialmente las dos primeras razones hicieron $.each popular, hasta el punto en que se agregó un forEach nativo al idioma.
Hay menos razones para usar forEach hoy, porque:
forEach no funciona con await .let y const con ámbito de bloque, por lo que la sobrescritura de variables después de cada iteración del ciclo ya no es un problema.for(... of ..) hace lo que la gente espera (sin necesidad de hasOwnProperty ).forEach Algunas personas aún optan por usar forEach si las viñetas anteriores no son una preocupación. No entiendo completamente eso, pero realmente no puedes discutir el estilo.