9
votes

JavaScript: Comment faire référence à une fonction anonyme dans la fonction elle-même?

Si arguments.callee n'est pas autorisé dans "Utiliser strict", et nous ne pouvons pas faire xxx

car dans IE qui ne fonctionnerait pas (ou cela fonctionnerait "étrangement") http://kangax.github.com/nfe/#jscript-bugs , puis quelles autres options devons-nous faire référence à la fonction anonyme dans la fonction elle-même?


2 commentaires

Ce n'est pas une fonction anonyme. Les fonctions anonymes n'ont pas de poignée (comme f dans votre cas)


@neebz: C'est le g qui ne le rend pas anonyme. La fonction dans une expression `var f = fonction () {}` `est anonyme.


3 Réponses :


4
votes

n'utilisez pas une expression de fonction nommée. Il suffit de déclarer et de l'initialiser la manière habituelle. XXX

La seule alternative viable avec ES5 strict consiste à utiliser le code de votre question et à gérer la mise en œuvre de NFE de Crappy de IE. Mais vous attendez-vous vraiment à un navigateur qui devient si horriblement mal (Ahem, c'est-à-dire) de mettre en œuvre "utiliser strict" à tout moment?


8 commentaires

@Matt balle J'ai peut-être été erronée, mais je me souviens de lire que les déclarations de fonctions (la voie normale) ne sont pas autorisées dans ES5 strict, sauf si elle est dans la portée "globale".


@Pacerier [citation nécessaire]


@Mattball IE10 Beta a utilisé strictement dedans. C'est battu chrome / safari.


@Pacerier: Cette page MDC me fait penser que vous vous souvenez de manière incorrecte.


@Raynos est-ce que IE10 a corrigé ce problème?


@Pacerier je ne sais pas. Je suppose que les expressions de fonction nommées fonctionnent dans IE9 s'ils ne vont pas être vraiment en colère.


@Pacerier: Les déclarations de fonctions sont autorisées dans le code global ou de fonction, mais pas à l'intérieur des blocs.


@Im qui fait du sens parfait quand même , puisque JS n'a que des étendues globales et de fonction, pas de blocage de blocs.



4
votes

2 commentaires

Le combinateur Y semble être trop exclu ici.


@Matt Ball: C'est une solution générique à ce problème qui fonctionne non seulement pour JavaScript mais pour toute langue . La solution de Jamietre, par exemple, ressemble essentiellement à une implémentation JavaScript idiomatique de la combinaison Y avec une certaine inlinage appliquée. Je doute que vous puissiez trouver vous-même un tort vous-même si vous n'avez jamais entendu parler de la combinaison Y.



1
votes

Voici une façon plutôt convoluée de le faire, mais ça marche:

http://jsfiddle.net / 4KKFN / 4 / P>

var f = function() {
    function f() {
        if (confirm('Keep going?')) {
            this.apply(this);
        }
    }
    f.apply(f);
}

f();


2 commentaires

Je ne peux pas dire que j'utilise réellement quelque chose comme ça en vrai code, mais semble être une solution de contournement légitime ...


Ayant maintenant juste lu sur "le Combinator Y" (d'abord, j'en ai jamais entendu parler) je me rends compte, c'est en fait beaucoup la même chose.