¿Fue el IIFE un diseño intencional o una consecuencia de muchas decisiones de diseño del lenguaje Javascript?

No estoy completamente seguro de si fue intencionado, pero Javascript, siendo esencialmente una especie de lenguaje funcional, me sorprendería si no.

Es solo un subproducto de cómo funciona Javascript, ¿entonces tal vez no está previsto?

Amo Javascript y amo los IIFE. Es un patrón que me permite usar solo una variable global en mi desarrollo front-end.

Tenga en cuenta que incluso un lenguaje no funcional como Java puede hacer esencialmente lo mismo con una clase interna, la sintaxis solo parece una pequeña diferencia.

public void sortAnswers () {

// un camino pre java de 8
Comparador comparador = nuevo Comparador () {
public int compare (Respuesta a1, Respuesta a2) {
return (a1.getVersion () – a2.getVersion ());
}
};

// un java 8 way
Comparador comparador2 = (x, y) -> {return (x.getVersion () – y.getVersion ()); };

Collections.sort (respuestas, comparador);

Collections.sort (respuestas, comparador2);
}

Usted define, luego instancia.

Volviendo a Javascript, cuando defina la función, puede llamarla, y eso es exactamente lo que sucede.

Aplicación var = {};

Application.sortService = (function () {

var sortByVer = función (a1, a2) {
return (a1.version – a2.version);
},

sortAnswers = function (respuestas) {
respuestas.sort (sortByVer);
volver (respuestas);
};

regreso ({
sortAnswers: sortAnswers
});

}) ();

var answerArr = []; // lleno de datos en otro lugar

Application.sortService.sortAnswers (answerArr);

De todos modos, supongo que el IIFE fue una consecuencia intencional, pero podría estar equivocado. Es genial para la encapsulación y el desarrollo modular en Javascript, simplemente no creo que el patrón IIFE se haya dado cuenta hasta más tarde.

Por lo que yo entiendo, este es un error para superar el extraño concepto de JavaScript (lo llamaría una deficiencia, si no tuviera miedo de dañar las creencias religiosas) del alcance. En muchos lenguajes de programación, los bloques (un conjunto de sentencias) se pueden utilizar en cualquier lugar donde se pueda encontrar una sola sentencia. Generalmente se denotan encerrando el conjunto entre llaves; Algunos idiomas usan una sintaxis diferente. Un bloque tiene su propio alcance, cualquier nombre declarado dentro del bloque es local para él.

En JS, las declaraciones entre llaves no forman un bloque; solo agrupan declaraciones. Dado que muchos programadores esperan que los frenos denoten bloques, esto puede ser confuso. Me atrapan todo el tiempo.

Entonces, la construcción que muestra es una notación esencialmente extraña para un bloque.

No es que tal construcción no se permita en un lenguaje con características funcionales … es solo que no puedo pensar en un uso.

Como un chico de Java, parece un truco total que simplemente debería ser la palabra clave privada.

Digo esto porque la intención del patrón es implementar el ocultamiento de datos. En Java, es claro y explícito. Lo haces con privado. Usando una vida, obtienes el resultado, pero no hay una pista legible en todos esos paréntesis.

Pero puede ser que JavaScript tenga una vista única en OOP, y una vida es solo una forma de mapear una vista clásica en un lenguaje no diseñado para soportarlo.