web-dev-qa-db-fra.com

Définir et appeler la fonction en une seule étape

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.

48
quis

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.

48
Marc Uberstein

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).

30
Matthias Benkard

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();
10
gkoberger

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);
6
twhb