El ()
que ajusta la función convierte la declaración de función anónima en una expresión de función que luego puede invocarse inmediatamente con el ()
que sigue a la expresión.
En este caso, el ()
externo realmente no es necesario ya que el var foo =
lo convertiría en una expresión. Además, el valor de foo
será undefined
ya que la invocación de función no devuelve nada.
Se puede utilizar para crear un nuevo ámbito variable, ya que una función es la única forma de lograrlo en javascript. (Javascript no tiene ámbito de bloque.)
Por lo tanto, la variable someVar
no es accesible para el alcance externo. Puede haber momentos en los que sea deseable hacerlo accesible de forma controlada. Para hacer esto, puede pasar una función fuera de ese alcance que hace referencia al someVar
. Luego, una vez que finaliza la invocación de la función, su contexto de ejecución permanecerá intacto y someVar
estará disponible de la manera que proporcione la función que usted entregó.
Esto se llama crear un closure
.
Digamos que ha pasado un valor a la invocación y lo ha asignado al someVar
. A continuación, puede return
una función fuera de la invocación a la variable foo
. Si esa función devuelve referencias someVar
, entonces podría usar esa función para obtener su valor.
var foo = (function (str) {
var someVar = str;
/*
function someFunc() {
return true;
}
*/
return function() {
alert(someVar);
};
})('somevalue');
foo(); // alerts 'somevalue'
Como se puede ver, la función ahora referenciado por foo
todavía puede acceder someVar
.
Digamos que lo ha cambiado para que la función devuelta a foo
pueda aceptar un argumento, lo que actualizará el valor de myVar
.
var foo = (function (str) {
var someVar = str;
/*
function someFunc() {
return true;
}
*/
return function(n) {
if(n) {
someVar = n;
} else {
alert(someVar);
}
};
})('somevalue');
foo(); // alerts 'somevalue'
foo('newvalue'); // give it a new value
foo(); // alerts 'newvalue'
ahora se puede ver, que la función de foo
realmente acceder a esa variable, ya que es capaz de cambiar su valor, y hacer referencia al nuevo valor que se haya establecido previamente.
también http://stackoverflow.com/questions/4531110/jquerys-function-jquery-syntax/4531124#4531124 –
Esto no es un duplicado exacto, ya que pide el caso más general, no es el caso específico de jQuery - que es un análogo de esto. – Orbling
@Orbling Sí, pero las respuestas en ambas preguntas no son específicas de jquery. –