Question

Prenons l'exemple de la structure jQuery si vous exécutez un code similaire à celui-ci:

$(document).ready(function init() { foo.bar(); });

La trace de pile que vous obtenez dans Firebug ressemblera à ceci:

init()
anonymous()
anonymous([function(), init(), function(), 4 more...], function(), Object name=args)
anonymous()
anonymous()

Comme vous pouvez le constater, ce n’est pas très lisible, car vous devez cliquer sur chaque fonction pour savoir ce que c’est. Les fonctions anonymes apparaîtront également sous la forme (?) () dans le profileur, et peuvent conduire au " ne peut pas accéder à la fermeture optimisée " punaise. Il me semble que ce sont de bonnes raisons pour les éviter. Ensuite, il y a le fait que ECMAScript 5 va déprécier arguments.callee dans son mode strict, ce qui signifie qu'il ne sera pas possible de faire référence à des fonctions anonymes, ce qui les rend un peu moins pérennes.

D'autre part, l'utilisation de fonctions nommées peut conduire à la répétition, par exemple:

var Foo = {
    bar: function bar() {}
}

function Foo() {}

Foo.prototype.bar = function bar() {}

Ai-je raison de penser que cette répétition est justifiée à la lumière de la commodité de débogage fournie par les fonctions nommées, et que la prévalence des fonctions anonymes dans de bons cadres comme jQuery est un oubli?

Était-ce utile?

La solution 2

J'ai trouvé la réponse à ma question dans cet article très informatif . Tout d’abord, j’avais raison de dire que les fonctions nommées sont plus souhaitables, mais la solution n’est pas aussi simple que d’ajouter des identifiants à toutes les fonctions anonymes. La raison principale en est que JScript implémente les expressions de fonction de manière très fragmentée.

Deuxièmement, il existe une distinction entre les instructions de fonction et les expressions. Une fonction anonyme est juste une expression de fonction avec l'identifiant omis, et ajouter un identifiant (le nommer) n'en ferait pas une instruction (sauf en JScript, raison pour laquelle elle est cassée). Cela signifie que toutes les autres réponses étaient erronées.

Autres conseils

Je conviens qu'il existe certains inconvénients à l'utilisation de méthodes anonymes dans JavaScript / EMCAScript. Cependant, n'oubliez pas comment ils devraient être utilisés. Les doublures simples que vous souhaitez transférer à une autre fonction sont souvent excellentes.

Mais pour moi, les fonctions anonymes sont plus lisibles dans le code source, car je suis sûr qu'elles ne sont utilisées que là-bas.

Les fonctions anonymes sont très pratiques. Une meilleure solution à ce problème, au lieu de nommer les fonctions, serait si firebug vous indiquait sur quelle ligne dans quel fichier la fonction anonyme a été créée.

init()
anonymous() // application.js, line 54
anonymous() // foo.js, line 2

Et la trace de la pile est le seul endroit où les fonctions anonymes posent un problème imo.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top