Existe-t-il un moyen en Javascript pour définir une fonction et l'appeler immédiatement, d'une manière qui permet de la réutiliser?
Je sais que vous pouvez effectuer des fonctions anonymes uniques:
(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
Ou vous pouvez nommer une fonction puis l'appeler ensuite:
function powers(i) {
var product = i * i;
console.log(i * i);
if (product < 1e6) { powers(product) };
}
powers(2); // Logs 4, 16, 256...
Mais existe-t-il une manière plus claire de définir et d'appeler une fonction d'un coup? Un peu comme un hybride des deux exemples?
Ne pas pouvoir le faire ne m'empêche pas de faire quoi que ce soit, mais on dirait que ce serait une belle façon expressive d'écrire des fonctions récursives ou des fonctions qui doivent être exécutées sur $(document).ready()
mais aussi plus tard lorsque des situations changement, etc.
Tu peux essayer:
(window.powers = function(i) {
/*Code here*/
alert('test : ' + i);
})(2);
<a href="#" onclick="powers(654)">Click</a>
Lien de travail: http://jsfiddle.net/SqBp8/
Il est appelé lors du chargement, et je l'ai ajouté à un anchor tag
Pour changer le paramètre et alert
.
Si tout ce que vous voulez c'est accéder à la fonction dans son propre corps, vous pouvez simplement spécifier un nom après le mot clé function
:
> (function fac (n) {
return (n === 0 ? 1 : n*fac(n-1));
})(10)
3628800
Il s'agit d'une fonctionnalité standard (voir ECMA-262 , éd. 5.1, p. 98).
Toutes les réponses ici sont proches de ce que vous voulez, mais ont quelques problèmes (l'ajouter à la portée globale, ne pas l'appeler réellement, etc.). Ceci combine quelques exemples sur cette page (même si cela nécessite malheureusement que vous vous souveniez arguments.callee
):
var test = (function() {
alert('hi');
return arguments.callee;
})();
Plus tard, vous pouvez l'appeler:
test();
Si vous ne vous souciez pas de la valeur de retour, vous pouvez le faire.
var powers = function powers(i) {
var product = i * i;
console.log(i * i);
if (product < 1e6) { powers(product) };
return powers;
}(2);