Ver Mensaje Individual
  #2 (permalink)  
Antiguo 23/07/2010, 12:32
Avatar de zerokilled
zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años, 6 meses
Puntos: 1485
Respuesta: llamado extraño funcion (funcion(){})

no ocurre nada porque no estas invocando la funcion. vamos por parte. si separamos el codigo en varias lineas lo podemos ver con mas claridad.
Código:
(
function(){ // declaracion de la funcion;
// cuerpo;
}
)() 
en negrita tienes la declaracion de la funcion. en rojo un par de parentesis que envuelve la funcion. y en verde tienes la parte que has omitido, la invocacion de la funcion.

ahora la explicacion. en javascript hay tres formas de crear funciones: con el constructor Function, sentencia function (function statement), y el literal function. estos ultimos dos difieren un poco. se le dice function statement cuando la funcion tiene nombre, y se le dice funcion literal cuando es una funcion anonima. ejemplo.
Código:
// function statement;
function fn(){}

// funcion anonima;
var fn = function(){};
entonces, fijate en el codigo que tienes duda, dentro de los parentesis rojos tienes una funcion literal. la razon por la que se envuelve en un par de parentesis es porque dicha funcion no esta pensada para ser almacenada en una variable como en el ejemplo que mostre. pero no solo eso, sino que su intencion tambien es invocarla. de nada vale crear una función literal, no almacenarla en variable y encima tampoco invocarla. porque de lo contrario el interprete -aunque crea la función- al final la desecha. entonces, ¿que sucede si invocamos la funcion sin el par de parentesis? simplemente javascript genera error de sintaxis, creo porque no hay un contenedor para la funcion. ese es el proposito de envolver la funcion en un par de parentesis. igual como en la algebra, los parentesis se solucionan primeros, y eso es lo que hace javascript. al los parentesis tener mayor prioridad, primero se crea la funcion antes de invocarla. sin embargo, -como dato extra- hay algo curioso. si en lugar de envolverlo en parentesis, defines una variable, no crea error. supongo que este ultimo funciona porque la variable funciona como contenedor de la funcion momentaneamente de forma temporera. luego la variable contiene lo devuelto por la función. o sea,
Código:
// sin envolver en parentesis e invocar, genera error;
function(){}();

// invocar con asignacion en variable;
var fn = function(){}();

// funcion envuelta en parentesis e invocar;
(function(){})();
finalmente, ¿que proposito tiene no almacenar la funcion literal en una variable? la mayoria de las veces es una tecnica de encapsulacion. o sea, "ocultar" variables, funciones, u objetos para que estos no sean modificados desde el exterior y solo desde unas funciones especificas.

@edit, he agregado algún detalle superficial pero que también pueden ayudar en la comprensión. marcados en italico.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Última edición por zerokilled; 26/07/2010 a las 13:21 Razón: agregar detalle extra para futuros lectores...