Selon la demande de l'OP, je participerai (sans me ridiculiser, j'espère: P)
Je pense que nous sommes tous d'accord pour dire que la récursivité est juste une façon plus élégante de coder. Si bien fait, cela peut rendre le code plus maintenable, ce qui est à mon humble avis tout aussi important (sinon plus) que le rasage de 0,0001 ms.
En ce qui concerne l'argument selon lequel JS n'effectue pas l'optimisation des appels de queue: ce n'est plus tout à fait vrai, l' utilisation du mode strict d'ECMA5 permet le TCO. C'était quelque chose dont je n'étais pas trop content il y a quelque temps, mais au moins je sais maintenant pourquoi arguments.callee
jette des erreurs en mode strict. Je connais le lien ci-dessus qui renvoie à un rapport de bogue, mais le bogue est réglé sur WONTFIX. En outre, le TCO standard arrive: ECMA6 (décembre 2013).
Instinctivement, et fidèle à la nature fonctionnelle de JS, je dirais que la récursivité est le style de codage le plus efficace 99,99% du temps. Cependant, Florian Margaine a raison de dire qu'il est probable que le goulot d'étranglement se trouve ailleurs. Si vous manipulez le DOM, vous devez probablement vous concentrer sur l'écriture de votre code aussi maintenable que possible. L'API DOM est ce qu'elle est: lente.
Je pense qu'il est presque impossible d'offrir une réponse définitive quant à l'option la plus rapide. Dernièrement, beaucoup de jspref que j'ai vus montrent que le moteur V8 de Chrome est ridiculement rapide pour certaines tâches, qui fonctionnent 4 fois plus lentement sur SpiderMonkey de FF et vice versa. Les moteurs JS modernes ont toutes sortes de trucs dans leurs manches pour optimiser votre code. Je ne suis pas un expert, mais je pense que la V8, par exemple, est hautement optimisée pour les fermetures (et la récursivité), contrairement au moteur JScript de MS. SpiderMonkey fonctionne souvent mieux lorsque le DOM est impliqué ...
En bref: je dirais que la technique qui sera la plus performante est, comme toujours en JS, presque impossible à prévoir.