Quid des performances entre un for et un foreach ? ;-)
Version imprimable
Quid des performances entre un for et un foreach ? ;-)
Tu es passé sur la page de MDC pour voir la doc de la méthode ?
https://developer.mozilla.org/En/Cor.../Array/ForEach
je pense que ça va répondre à ta question… ils disent que ça fait pas parti d'un standard ecmascript puisque celui sur lequel la méthode figure est encore un draft.
Merci le_chomeur, je vois bien ce que tu veux dire. Une petite remarque concernant
ton exemple:
Tu appelle la fonction associée à action avec la notation (i) après l'accolade fermante
mais tu ne déclare pas de paramètre dans ta fonction. Si bien que la variable i utilisée
n'est pas le paramètre mais la variable i de la boucle.
Ton code fonctionne très bien aussi ainsi:
Moi je préfère passer explicitement un paramètre ce qui évite la variableCode:
1
2
3
4
5
6
7 var action = function(){ var t = i ; return function(){ alert(t) }; }(); // sans rien passer
Ainsi i passe dans t et c'est t qui est "closuré", marche aussi avec t nommé iCode:
1
2
3
4
5
6 var action = function(t){ return function(){ alert(t) }; }(i);
car il s'agirait d'une variable locale qui a priorité sur le i exterieur.
@DoubleU en effet, la fonction bind présentée dans mon exemple est issue de prototype elle est d'ailleur utilisable dans le cas de l'exemple de funewik.
bindAsEventListener est similaire mais passe le paramètre 'event' avant les arguments
(si mes souvenir de prototype sont bons :-) et je pense que si on l'utilise dans ce cas
alors 'xhr' vaudrait 'undefined' à vérifier.
effectivement marcha :D
juste a faire TRES attention de ne pas passer :
qui sera l'évènement sinon :) ( juste une précision pour les autres ^^ )Code:
1
2
3
4
5 var action = function(){ return function(t){ alert(t) }; }(i);
"Array.forEach" (qui est le même que Array.prototype.forEach) est fait pour manipuler tout ce qui "ressemble" à un array. C'est a dire des index numérique et un "length". Pas besoin de les convertir. Voir l'exemple que le_chomeur m'a demandé.
Tous les truc du DOM qui ont un ".length" sont ennumérables avec ça, magie.
https://developer.mozilla.org/en/Cor...y-like_objects
Nous sommes tout a fait d'accord sur le fait que cela fonctionne.
Mais je suis pas d'accord que tu as qualifie de "Bricolage" la technique
qui consiste à itérer un ArrayLike avec une boucle for par rapport
à l'utilisation de Array.forEach
Moi je pense que c'est plutôt une mauvaise habitude, un exemple:
Six mois plus tard, quelqu'un d'autre relis ce code et doit implémenter un affichageCode:
1
2
3 function show(toto) { Array.forEach(toto, function(e) { alert(e); }); }
inversé, il serait tenté de modifier la fonction ainsi:
si forEach fonctionne pour les ArrayLike ce n'est pas le cas de Array.reverseCode:
1
2
3
4
5 function show(toto, reverse) { if(reverse) Array.reverse(toto); Array.forEach(toto, function(e) { alert(e); }); }
c'est pourquoi je pense que c'est une mauvaise pratique que de mélanger ces
deux types.
C'est pour faire face à ce genre de risque que je parlais de convertir des
ArrayLike en vrai Array avant d'utilser des méthodes de Array dessus.
ok, vu comme ça.
Perso je n'ecris presque plus de boucle for. Je suis d'accord avec ta signature :p
+1 marcha ,
de plus j'ajouterais qu'a l'heure actuelle il vaut mieux se baser sur des références CROSSBROWSER :ccool:
Array.prototype.forEach :
Opera, WebKit, FF.
Array.forEach :
FF.
en rajoutant ces 5 misérables lignes :
Opera, WebKit.Code:
1
2
3
4
5 if (!Array.forEach) { Array.forEach = function (array, callback, context) { Array.prototype.forEach.call(array, callback, context); } }
Pour que IE le supporte c'est grand max 10 lignes. C'est encore plus crossbrowser que les getter / setter pour les objets perso, on a vu pire.
Pour des trucs fun sur les énummérations :
http://dean.edwards.name/weblog/2006/07/enum/
( edit ) J'insiste parce que ça me rend fou cet immobilisme. On peut faire énormément de choses du même genre que ce que jQuery propose en natif. Il suffit de le savoir, et c'est pas en restant sur une boucle for que on va faire bouger les choses. Si assez de monde l'utilise, IE l'implémentera. C'est aussi simple que ça.
En même temps, c'est pas le sujet du topic...
Et ca reste du sucre syntaxique, donc bon, c'est ptete pas la peine d'épiloguer pendant 20 posts...
A ce propos , il existe un article très intéressant qui en gros dit que bindasEventlistener ne sert quasi jamais et qu'il faut lui préférer bind()
http://proto-scripty.wikidot.com/pro...seventlistener