Hay seis maneras/contextos en los que para crear funciones:
1) notación estándar declarativa (más conocidos por la personas con antecedentes C)
function foo() {}
Todo el resto son función expresiones:
2) como un método de un objeto literal
var obj = {
foo: function() {}
};
3) Como un método de un objeto instanciado (creado cada vez new
se exectued)
var Obj = function() {
this.foo = function() {};
};
4) Como método de un prototipo (creada sólo una vez, independientemente del número de veces que se ejecuta new
)
var Obj = function() {};
Obj.prototype.foo = function() {};
5) Como una función anónima con una referencia (mismo efecto que # 1) *
var foo = function() {};
6) Como una función anónima inmediatamente ejecutado (completamente anónima)
(function() {})();
* Cuando Miro esta afirmación, considero el resultado. Como tal, realmente no los considero anónimos porque se crea inmediatamente una referencia a la función y, por lo tanto, ya no es anónima. Pero es lo mismo para la mayoría de las personas.
El paréntesis externo en 'obj' es superfluo –
¡Oh! Una respuesta a una de mis publicaciones en SO sobre cómo escribir código usando el patrón del módulo decía que sin esos paréntesis, a veces las funciones anónimas pueden fallar. Todavía no recibí una explicación de por qué. No estoy seguro de si se aplican solo a patrones de módulos o a todas las funciones anónimas. Es por eso que los agregué. –
Creo que es solo cuando evalúa un objeto como 'eval (" ({a: 1}) ")' – YOU