Variables JavaScript déclarer à l'extérieur ou à l'intérieur de la boucle?
En AS3, je crois, il faut initialiser toutes les variables à l'extérieur des boucles pour des performances accrues. Est-ce le cas avec du JavaScript? Ce qui est mieux /rapide /best-practice?
var value = 0;
for (var i = 0; i < 100; i++)
{
value = somearray[i];
}
ou
for (var i = 0 ; i < 100; i++)
{
var value = somearray[i];
}
À l'extérieur! toujours à l'extérieur.
Hmm, ne pas les déclarations de variables obtenir poussé à la portée de la fonction, de toute façon dans les deux Javascript et AS3? Si je suis correct, alors il n'a vraiment pas d'importance.
avez-vous essayez d'assigner avant de déclarer dans un corps de fonction? Peut-être que vos préjugés vous mènent à s'égarer. WRT performance, avec des push-up de portée, si le JS est interpretted, puis il vous mâcher supplémentaire des cycles à l'intérieur d'une boucle de bloc. Si compilé (dont la plupart des moteurs de nos jours), il ne sera pas question.
Excellente question! Merci. Après avoir lu toutes les réponses, je crois que si c'est juste une petite boucle ou seulement une variable temp je vais les garder là où ils sont nécessaires et il n'a pas d'effet de la performance. Si une variable est utilisée dans une fonction plus d'une fois, pourquoi ne pas se référer à l'intérieur de la fonction et enfin globals alors peut-être assis à l'extérieur de la fn()
Je suis surpris que personne n'a essayé de mesurer la performance. J'ai créé un jsperf. Semble être un peu plus vite lorsqu'ils sont déclarés à l'intérieur de la boucle pour Safari et Firefox, c'est l'inverse pour Chrome...
Hmm, ne pas les déclarations de variables obtenir poussé à la portée de la fonction, de toute façon dans les deux Javascript et AS3? Si je suis correct, alors il n'a vraiment pas d'importance.
avez-vous essayez d'assigner avant de déclarer dans un corps de fonction? Peut-être que vos préjugés vous mènent à s'égarer. WRT performance, avec des push-up de portée, si le JS est interpretted, puis il vous mâcher supplémentaire des cycles à l'intérieur d'une boucle de bloc. Si compilé (dont la plupart des moteurs de nos jours), il ne sera pas question.
Excellente question! Merci. Après avoir lu toutes les réponses, je crois que si c'est juste une petite boucle ou seulement une variable temp je vais les garder là où ils sont nécessaires et il n'a pas d'effet de la performance. Si une variable est utilisée dans une fonction plus d'une fois, pourquoi ne pas se référer à l'intérieur de la fonction et enfin globals alors peut-être assis à l'extérieur de la fn()
Je suis surpris que personne n'a essayé de mesurer la performance. J'ai créé un jsperf. Semble être un peu plus vite lorsqu'ils sont déclarés à l'intérieur de la boucle pour Safari et Firefox, c'est l'inverse pour Chrome...
OriginalL'auteur davivid | 2010-09-10
Vous devez vous connecter pour publier un commentaire.
Il est absolument aucune différence dans le sens ou la performance, en JavaScript ou ActionScript.
var
est une directive de l'analyseur, et pas une commande exécutée au moment de l'exécution. Si un identifiant particulier a été déclarévar
une fois ou plus n'importe où dans un corps de la fonction(*), pour toute utilisation de cet identifiant dans le bloc ferons référence à la variable locale. Il ne fait aucune différence sivalue
est déclaréevar
l'intérieur de la boucle, en dehors de la boucle, ou les deux.Par conséquent, vous devriez écrire à celui qui vous est le plus lisible. Je suis en désaccord avec Crockford, mettre tous les vars au sommet d'une fonction est toujours la meilleure chose. Pour le cas où une variable est utilisée temporairement dans une section de code, c'est mieux de déclarer
var
dans cette section, afin que la section est autonome et peut être copié et collé. Sinon, copier-coller quelques lignes de code pour une nouvelle fonction au cours de refactoring, sans séparément la cueillette et le déplacement de l'associévar
, et vous avez vous-même un accident global.En particulier:
Crockford va vous recommandons de supprimer la deuxième
var
(ou de retirer les deuxvar
s et nevar i;
ci-dessus), et jslint sera whinge à vous pour cette. Mais IMO c'est plus facile à gérer pour garder à la foisvar
s, en gardant tout le code relatives à l'ensemble, au lieu d'avoir un extra, facilement oublié de bits de code au début de la fonction.Personnellement, j'ai tendance à déclarer que
var
à la première affectation d'une variable dans une section indépendante de code, si oui ou non il y a une autre utilisation séparée du même nom de variable dans une autre partie de la même fonction. Pour moi, d'avoir à déclarervar
à tous n'est pas souhaitable JS verrue (il aurait été mieux d'avoir des variables par défaut en local), je ne vois pas ça comme de mon devoir dupliquer les limites de [une ancienne version de] ANSI C dans du JavaScript.(*: autres que dans les corps de fonction)
+1 je suis en désaccord avec Crockford raisonnement (cité dans le livre de Daniel de réponse), que les développeurs JavaScript nous ne devrions pas être l'écriture de code pour que les autres "C de la famille" les programmeurs peuvent le comprendre. J'utilise souvent var à l'intérieur si blocs et de boucles parce qu'il fait plus de sens pour moi.
-1 L'OP demande si vars dans le corps de la boucle doit être déclarée avant la boucle commence. La valeur de l'indice de la boucle est clairement un cas particulier (et est hissé) et ne pas aider les OP à tous.
Indices de boucles ne sont pas un cas particulier, ils sont manipulés et hissé exactement de la même manière qu'une attribution normale.
+1 Crockford se trompe à ce sujet (et d'autres, mais je m'égare). Exigeant que
var
est utilisé uniquement dans le haut d'une fonction est juste poser accidentelle variable globale de la création. Et ayant une masse de sans rapport avec toutes les variables déclarées dans un spot est sémantiquement vide de sens, surtout quand certains de ces variables peut finir par ne jamais être utilisé.OriginalL'auteur bobince
En théorie, il ne devrait pas faire de différence en JavaScript, car la langue n'a pas de bloc de portée, mais seulement en fonction de la portée.
Je ne suis pas sûr au sujet de la performance de l'argument, mais Douglas Crockford recommande toujours la
var
déclarations devraient être les premières déclarations dans le corps de la fonction. Citant Les Conventions de programmation pour le Langage de Programmation JavaScript:Je pense qu'il a un point, comme vous pouvez le voir dans l'exemple suivant. Déclarer les variables au sommet de la fonction ne doit pas confondre les lecteurs à penser que la variable
i
est tenue dans le champ d'application de lafor
boucle bloc:Je n'ai pas dit qu'il n'affecte pas les performances. Je viens de faire un argument pour les mettre à l'extérieur de la boucle, de pertinence de la performance.... Je n'ai pas de références pour l'exécution des arguments, mais vous n'avez pas citer tout dans votre réponse 🙂
avez-vous une source pour ça?
Autant que je sache, même si vous déclarez des variables à l'intérieur d'une boucle,
ecma- / javascript
croiserez ceux jusqu'au moment de l'exécution. Qui est appelé "Levage". Donc, il ne devrait y avoir aucune différence.Merci ... Ce n'était certainement pas mon intention de faire polémique 🙂
OriginalL'auteur Daniel Vassallo
La
ECMA-/Javascript
languehoists
toute variable qui est déclarée n'importe où dans le haut d'une fonction. C'est parce que cette langue ne ontfunction scope
et ne pas ontblock scope
comme beaucoup d'autres C-comme les langues.Qui est également connu comme
lexical scope
.Si vous déclarez quelque chose comme
Cela devient
hoisted
à:De sorte qu'il ne fait aucune différence dans la performance (Mais corrigez-moi si je suis totalement faux).
Un bien meilleur argument pour pas la déclaration d'une variable quelque part d'autre que dans le haut d'une fonction est lisibilité. La déclaration d'une variable à l'intérieur d'un
for-loop
pourrait conduire à la mauvaise hypothèse que cette variable ne peut être consulté dans le corps de la boucle, qui est totalement faux. En effet, vous pouvez accéder à cette variable n'importe où dans le champ d'application actuel.Comment ES6 du
let
affecter cette réponse?OriginalL'auteur jAndy
L'année prochaine, tous les navigateurs ont JS moteurs de précompiler le code de sorte que la différence de performances (qui vient de l'analyse du même bloc de code, encore et encore plus de l'exécution de la mission) doit devenir négligeable.
Aussi, ne jamais optimiser les performances, sauf si vous avez. Maintenant les variables à proximité de l'endroit où vous en avez besoin la première fois maintient votre code propre. Sur le côté négatif, les personnes qui sont utilisés pour les langues avec les domaines de bloc pourrait être confondue.
OriginalL'auteur Aaron Digulla
J'ai juste fait un test simple en Chrome. Essayez le violon dans votre navigateur et de voir les résultats
Résultat est que le dernier test a ~8 secondes et les 2 précédents sont que d'environ 2 secondes. Très renouvelable et quel que soit l'ordre.
Donc, cela me prouve, que l'on doit toujours déclarer la rva à l'extérieur de la boucle. Curieux cas pour moi, c'est la première où je déclare
i
dans le for() déclaration. Celui-ci semble être tout aussi rapide que le 2ème test où je l'ai pré-déclarer l'index.Wow, sur la base de cette simple test, c'est à dire suce 100X plus? =)
Les résultats sont tous sur la place pour moi, l'absence de croix-navigateur gagnant si il y a parfois de grands écarts de vitesse. Bizarre. Je pense que Andy le violon est un test mieux si, en plaçant chaque candidat dans sa propre fonction... il est certain que si le script est exécuté en dehors d'une fonction, il ne devrait pas vraiment être tester rien que la
var
est de déclarer qu'une variable globale qui serait de toute façon globale.Plus d'un an après le fait, mais SHAPOW
Ce n'est pas la mienne, mais j'ai pensé que certains d'entre vous seraient intéressés: jsperf.com/var-in-for-loop
OriginalL'auteur mkoistinen
Une autre considération, maintenant que nous avons
let
etconst
dans ES2015, est que vous pouvez maintenant la portée des variables spécifiquement à la boucle de bloc. Donc, à moins que vous aurez besoin de la même variable en dehors de la boucle (ou si chaque itération dépend d'une opération effectuée à cette variable dans l'itération précédente), il est probablement préférable de le faire:OriginalL'auteur Matt Browne
JavaScript est un langage écrit en bas en C ou C++, je ne suis pas très sûr que l'on est. Et l'un de ses objectifs est de sauver la lavour de la manipulation de la mémoire interne.
Même en C ou C++, vous n'aurez pas à vous soucier de savoir si elle va consommer beaucoup de ressources lorsque les variables sont déclarées à l'intérieur d'une boucle. Pourquoi devriez-vous vous inquiéter à ce sujet dans le JavaScript?
Il n'est pas converti en C/C++. Javascript sera compilé en un ensemble d'instructions qui sont exécutées par le JS d'exécution (c'est à dire une machine virtuelle s'exécutant dans le navigateur). Le même principe s'applique à d'autres langages dynamiques tels que Python et Ruby.
Merci pour l'info. Je n'étais pas sûr à propos de JS de la conversion de C ou de C++. J'ai donc utilisé peut être dans mon commentaire
OriginalL'auteur Yan Yang
Eh bien, cela dépend de ce que vous essayez d'atteindre... si
value
supposons qu'une variable temporaire à l'intérieur de la boucle de bloquer ensuite c'est beaucoup plus clair d'utiliser la deuxième forme. C'est aussi plus logique et plus clair.OriginalL'auteur Crozin
Il Ne fait pas de différence si vous déclarez des variables à l'intérieur ou à l'extérieur de la boucle for.
Ci-dessous est un exemple de code pour tester.
Les résultats ont montré dans mon cas
Merci --
MyFavs.dans
OriginalL'auteur myfavs.in
La question ici est en fait de déclarer une variable à l'intérieur d'une boucle. Il suffit de penser ce qui se passe si vous faites cela:
Pensez-vous de ce qui est juste? Non ... parce que vous ne voulez pas de déclarer une variable de nombreuses reprises. Lorsque vous déclarez une variable dans une boucle n'est-il pas de déclarer autant de fois que la boucle s'exécute? Évidemment, il va te frapper quand vous êtes dans 'use strict' mode. Les gens n'ont pas d'accord avec Crockford, sans réfléchir à la question d'origine.
De sorte qu'il est toujours bon de déclarer des variables sur le dessus-1. Pour des raisons de lisibilité, 2. Prendre de bonnes habitudes.
OriginalL'auteur Vivek Pohre
En ce qui concerne la performance après l'exécution du test sur Chrome, Firefox, et jsperf sur un OS Linux, il ne semble pas y avoir de différence de performances entre la déclaration des variables dans une boucle et de sortir d'une boucle. C'est une petite différence, mais c'est aussi aggravé par le nombre d'itérations et le montant des déclarations de variables.
Donc pour de meilleures performances, je voudrais suggérer de déclarer des variables en dehors de la boucle. Ou mieux encore, de déclarer vos variables en ligne. Voir un exemple.
Remarquez comment la variable 'al' et 'av' sont dans la boucle de déclaration en ligne. Cette inline déclaration m'a fourni systématiquement de meilleures performances. Même sur la déclaration des variables en dehors de la boucle. De nouveau, la différence de performances est vraiment petit.
https://jsperf.com/outside-inline-for-loop-ase/1
Comme les déclarations de variables sont hissés, il n'y a vraiment aucune différence.
OriginalL'auteur AlexanderElias