web-dev-qa-db-fra.com

Arguments javascript.callee qu'est-ce que c'est pour

Je n'ai trouvé aucun navigateur de navigateur complet de cette variable.

Quel est arguments.callee pour? Comment ça marche?

Quels arguments a-t-il?

23
Jordi P.S.

arguments.callee Est une référence à la fonction qui est actuellement appelée. Premières choses d'abord: Ne l'utilisez pas: Si vous êtes dans un contexte strict, cela ressemblera à des erreurs.

Cependant, personnellement - et Je ne suis pas seul à cela - Je vais manquer cette propriété. Avant de commencer à expliquer pourquoi, je vais vous donner un pseudo-exemple de quand vous pourriez utiliser ceci:

var looper = (function(someClosureVar)
{
    setTimeout((function(resetTimeout)
    {
        return function()
        {
            //do stuff, stop OR:
            resetTimeout();
        };
    }(arguments.callee)),1000);
}(document.getElementById('foobar')));

J'espère que vous aimez les fermetures, parce que je le fais - et c'est là que arguments.callee Sont très susceptibles de se produire. La prochaine ligne est la suivante: l'argent est:

(arguments.callee)

Est une référence à la fonction anonyme qui définit le délai initial, dans une portée de fermeture (qui a accès à 1 élément DOM, dans ce cas). Les fonctions anonymes sont cyclées après leur retour, mais dans ce cas, je l'ai ajouté à la portée du calendrier du délai d'attente (l'a transmis comme un argument à une autre fonction anonyme qui renvoie le rappel réel). Il est donc toujours référencé quelque part.
Maintenant, si vous êtes strict, vous n'avez pas besoin de vous inquiéter car c'est ce que le code ressemblerait au mode strict:

var looper = (function tempName(someClosureVar)
{
    setTimeout((function(resetTimeout)
    {
        return function()
        {
            //do stuff, stop OR:
            resetTimeout();
        };
    }(tempName)),1000);
}(document.getElementById('foobar')));

Nommez la fonction et c'est tout. Pourquoi je n'aime-je pas ça? arguments.callee Soulève des drapeaux, comme des fonctions anonymes que se déroulent de quelques pressions de fermeture. Je suppose que c'est juste une habitude, mais c'est celui qui, je me sens, m'aide à structurer et à déboguer mon code plus facilement.
[.____] Couple qu'avec une haine pathologique pour IE, qui est naturelle à quiconque faisant des scripts côté client. =IE versions qui ne prennent pas en charge le mode strict, ont tendance à fuite le nom de la fonction à l'espace de noms global, donc jamais Autoriser la mémoire associée à la fonction (et la fermeture que nous avons créée) soit GC'ed. Ce qui pourrait conduire à des références circulaires, et, pire encore, des références circulaires de DOM, qui peuvent entraîner des fuites de mémoire.

En fait: Voici un autre exemple réel de l'endroit où arguments.callee Est utilisé: Délégation d'événement et auto-écouteurs d'événement
[.____] Voici encore plus d'informations sur le mode strict JS et la récursivité en utilisant arguments.callee.

La dernière question a, imo l'exemple de coupe la plus claire de la façon dont arguments.callee Est pratique: des fonctions de remplacement récursif:

function someF(foo)
{
    //'use strict'; <-- would throw errors here
    foo = foo.replace(/(a|b)+/gi, function (p1,p2)
    {
        if (p1.match(/(a|b){2,}/i))
        {
            return p1.replace(/(a|b)/gi,arguments.callee);//recursive
        }
        return (p2.match(/a/i) ? 'X':'Y');
    });
}

Comme demandé arguments.callee sur MDN, avertit d'une utilisation en mode strict (ECMA 5, qui explique pourquoi DC dit arguments.Callee est obsolète)
[.____] et plus strict

31
Elias Van Ootegem

Calee fait partie de la norme ECMAScript 3, elle devrait donc être sûre pour une utilisation croisée du navigateur. Callee détient la fonction qui exécute et l'invoque actuellement, elle invoquera la fonction actuelle. Par conséquent, Callee prend exactement les mêmes arguments que la fonction enfermante (ou plutôt celle-ci est la fonction actuelle). Quelques informations supplémentaires sont disponibles ici: https://developer.mozilla.org/en-us/docs/javascript/reference/function_and_function_scope/arguments/callee

Il est considéré comme un mauvais style d'utiliser callee. Vous donner un nom de fonction et utilisez ce nom ...

4
Mathias Schwarz

Il spécifie la fonction d'exécution actuelle, alors arguments.callee est la fonction actuelle. Cela peut être utile si vous devez aller récursif dans une fonction anonimique. Ici, exemple de Mozilla:

function create() {
   return function(n) {
      if (n <= 1)
         return 1;
      return n * arguments.callee(n - 1);
   };
}

var result = create()(5); // returns 120 (5 * 4 * 3 * 2 * 1)
4
Danil Speransky

callee est une propriété de l'objet Arguments. Il peut être utilisé pour désigner la fonction d'exécution actuelle à l'intérieur du corps de la fonction de cette fonction.

Documents MDN ici

2
benqus

arguments.Callee est une ronde sur la manière de connaître la fonction d'exécution actuelle en demandant 'qui appelle cet argument spécifique? " . . . .

 function factorial(a){
    if(a>0)
      return a*arguments.callee(a-1);
 }

Ici si vous appelez factorielle (5), il vérifiera la condition supérieure à 0, et s'il est vrai, exécutez la même logique pour le prochain numéro inférieur. . . Dans certains cas, vous ne connaissez pas le nom de la fonction à appeler. . . .so vous pouvez utiliser cette propriété

voici une bonne référence

arguments.callee de MDN

Mise à jour: arguments.callee() est obsolète dans ES5

2
palerdot