2011-09-21 10 views
40

¿Hay alguna forma en Javascript para definir una función e invocarla de inmediato, de forma tal que permita su reutilización?Función de definición y llamada en un solo paso

Yo sé que puedes hacerlo de una sola vez funciones anónimas:

(function(i) { 
    var product = i * i; 
    console.log(product); 
    // Can't recurse here because there's no (ECMA standard) way for the 
    // function to refer to itself 
}(2)); // logs 4 

O puede nombrar una función luego llamarlo después:

function powers(i) { 
    var product = i * i; 
    console.log(i * i); 
    if (product < 1e6) { powers(product) }; 
} 

powers(2); // Logs 4, 16, 256... 

Pero hay una manera más limpia de definir y llamar una función de una vez? ¿Algo así como un híbrido de ambos ejemplos?

No poder hacer esto no me impide hacer nada, pero parece que sería una buena forma expresiva de escribir funciones recursivas o funciones que deben ejecutarse en $(document).ready() pero también más adelante cuando cambien las situaciones, etc.

+0

duplicado posible de [¿Puedo nombrar una función de JavaScript y ejecutarlo de inmediato?] (Http://stackoverflow.com/questions/6404196/can-i-name-a-javascript-function-and-execute -it-inmediatamente) – brichins

Respuesta

43

puede probar:

(window.powers = function(i) { 
 
    /*Code here*/ 
 
    alert('test : ' + i); 
 
})(2);
<a href="#" onclick="powers(654)">Click</a>

enlace de trabajo: http://jsfiddle.net/SqBp8/

Se llama en carga, y lo he agregado a anchor tag para cambiar el parámetro y alert.

+3

¡Solución inteligente! Funciona sin la "ventana" también, pero obviamente los globales son malvados ... – quis

+1

Simplemente agregue un 'var powers;' antes de la función de ejecución inmediata y listo. –

23

Si lo que quieres es acceder a la función dentro de su propio cuerpo, sólo tiene que especificar un nombre después de la palabra clave function:

> (function fac (n) { 
    return (n === 0 ? 1 : n*fac(n-1)); 
    })(10) 
3628800 

Ésta es una característica estándar (ver ECMA-262, ed 5.1., P. 98).

+3

Esto es muy elegante para lo que hace. – quis

8

Todas las respuestas aquí están cerca de lo que quiere, pero tiene algunos problemas (agregarlo al alcance global, no llamarlo realmente, etc.). Esto combina algunos ejemplos en esta página (aunque por desgracia se requiere para recordar arguments.callee):

var test = (function() { 
    alert('hi'); 
    return arguments.callee; 
})(); 

Más tarde, se le puede llamar:

test(); 
+2

El único problema es que arguments.callee está [en desuso] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope/arguments/callee) y arroja un error en ES5 en estricto modo. – Tivie

+2

@Tivie Pero puede nombrar la función anónima. 'var test = (función fn() {alerta ('hi'); return fn;})();' –

4

Si no se preocupan por el valor de retorno , Puedes hacerlo.

var powers = function powers(i) { 
    var product = i * i; 
    console.log(i * i); 
    if (product < 1e6) { powers(product) }; 
    return powers; 
}(2); 
Cuestiones relacionadas