javascript - immediately - Función de definición y llamada en un solo paso
immediately invoked function expressions javascript (4)
¿Hay alguna forma en Javascript para definir una función e invocarla de inmediato, de forma tal que permita su reutilización?
Sé que puedes hacer funciones anónimas puntuales:
(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 y luego llamarla:
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 clara 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 tarde cuando las situaciones cambian, etc.
Puedes 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 una anchor tag
para cambiar el parámetro y la alert
.
Si no le importa el valor de retorno, puede hacerlo.
var powers = function powers(i) {
var product = i * i;
console.log(i * i);
if (product < 1e6) { powers(product) };
return powers;
}(2);
Si todo lo que desea es acceder a la función dentro de su propio cuerpo, simplemente puede especificar un nombre después de la palabra clave de la function
:
> (function fac (n) {
return (n === 0 ? 1 : n*fac(n-1));
})(10)
3628800
Esta es una característica estándar (ver ECMA-262 , ed 5.1, p.98).
Todas las respuestas aquí están cerca de lo que quiere, pero tiene algunos problemas (agregarlo al alcance global, no llamarlo, etc.). Esto combina algunos ejemplos en esta página (aunque desafortunadamente requiere que recuerde arguments.callee
):
var test = (function() {
alert(''hi'');
return arguments.callee;
})();
Más tarde, puedes llamarlo:
test();