Je suis nouveau sur Dart (de JS) et j'essaie de donner un sens à ce programme simple.

Lors de la déclaration de variables et de leur configuration à l'extérieur dans la partie supérieure d'un programme, il semble que (???) l'affectation ne se produise pas avant l'exécution de main (). Voir ci-dessous.

List<int> a1=[1,2,3];
List<int> b1=new List.from(a1);


void main() {
  a1.add(9);
  print(a1);  // [1,2,3,9]
  print('b1 $b1');  //  CONFUSING   [1,2,3,9]  (I expected [1,2,3])


  List<int> a2=[1,2,3];
  List<int> b2=new List.from(a2);
  a2.add(77);

  print(a2);   // [1,2,3,77]
  print('b2 $b2');  // [1,2,3], as expected
}

Est-ce parce qu'il y a une exécution de code Just In Time (JIT)? Ou que les affectations se produisent plus tard, comme avec certains gotchas JS. J'ai essayé de lire les documents à ce sujet mais je n'ai rien pu trouver avec l'ordre d'exécution du code.

Je suis le plus intéressé à apprendre comment j'apprendrais cela moi-même. Tous les liens vers la section appropriée des documents sont donc appréciés.

PS. Dans JS, Chrome Developer Tools fournit un débogueur pratique avec des points d'arrêt et je l'utilise généralement pour vérifier les bogues de l'ordre d'exécution.

Merci d'avance.

0
chongman 4 nov. 2019 à 09:16

1 réponse

Ce n'est pas JIT, juste une initialisation paresseuse des variables globales.

Dart garantit qu'aucun code utilisateur ne s'exécute avant le début de main. Pour cela, il initialise par défaut les variables globales et statiques lors de leur première lecture. Cela signifie que vous devez être prudent lorsque votre initialiseur de variable globale fait référence à des objets mutables.

3
lrn 4 nov. 2019 à 08:07