3 votes

Nouvelle variable locale à l'intérieur de grandes boucles POUR, est-ce un problème?

Dans cette fonction d'exemple simple :

doSomething = function(withThisId) {
  var videos      = getVideos(), // tableau de vidéos
      discovered  = false
  ;

  for(var i = 0; i < 50000; i++) {
    var keepToCheck = videos[i];

    if(keepToCheck.id == withThisId) {
      discovered = true;
      break;
    }
  }

  return discovered;
};

J'aimerais savoir si :

  1. À l'intérieur de la boucle for, nous initialisons une nouvelle variable appelée keepToCheck à chaque itération et l'utilisons ensuite. Cela signifie-t-il qu'une nouvelle variable est créée à chaque fois, donc potentiellement nous avons la possibilité de 50 000 variables keepToCheck existant en mémoire (jusqu'à ce que le GC le nettoie) ?

    Ou le moteur JS est-il suffisamment intelligent pour savoir que la variable peut être réutilisée et ne pas créer de doublons ?

  2. Y a-t-il un avantage en termes de performance si nous initialisons var keepToCheck en dehors de la boucle for et ensuite le définissons simplement comme keepToCheck = videos[i]; ?

J'ai essayé de rechercher cela mais je ne trouve pas de suggestions sur le net.

1voto

Niet the Dark Absol Points 154811

En JavaScript, une seule variable sera créée. Après la première itération, keepToCheck existe déjà et sera écrasé, pas recréé.

Cependant, pour des raisons d'organisation, je préfère lister toutes les variables dès que je sais qu'elles sont nécessaires. Dans ce cas, j'aurais :

var videos = getVideos(),
    discovered = false,
    keepToCheck, i;

Suivi du reste du code. Si certaines variables ne sont utilisées que dans un if, je les déclare avec var dès le début de ce bloc.

1voto

AutoSponge Points 788

Les variables sont "hoisted" au sommet de la fonction dans laquelle elles sont déclarées et sont collectées par le garbage (complètement à la discrétion du VM/navigateur) si elles sont écrasées. Les déclarations de variables répétitives (par exemple, dans une boucle) sont juste une perte de ressources. Bien qu'il n'y ait pas 50 000 variables en mémoire, cela gaspille du temps de traitement et une certaine quantité de mémoire en fonction du moment où la collecte de garbage s'exécute. C'est pourquoi il est préférable de déclarer les variables en haut de la fonction. Essayez d'exécuter JSLint/JShint sur ce code pour voir ce que je veux dire.

0voto

Petar Ivanov Points 29530

Je ne connais pas beaucoup le JS, mais dans d'autres langages avec de la collecte de déchets, les variables locales ne sont pas soumises à la collecte de déchets - elles vivent sur la pile, donc après la sortie de la portée elles disparaissent. Ainsi, vous ne pouvez pas avoir plus d'une de ces variables existant en même temps. Cependant, vous pourriez vous retrouver avec des adresses différentes pour chaque itération.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X