Appliquer la notion

Question

Que se passe-t-il si on définit dans une boucle if une variable locale portant le même nom qu'une variable globale déjà déclarée préalablement ?

Expliquez à partir de l'exécution du code suivant :

1
/** JavaScript */
2
var numberApple = 30
3
var enoughApple = false
4
console.log(numberApple)
5
if(numberApple === 30)
6
{
7
  let enoughApple = true
8
  console.log('A-t-on assez pommes ? (dans le "if")', enoughApple)
9
}
10
console.log('A-t-on assez pommes ? (en dehors du if)', enoughApple)

Solution

  1. Une variable enoughApple est d'abord définie comme globale et initialisée avec false.

  2. Ensuite une autre variable enoughApple est définie localement au bloc if : elle porte le même nom, mais c'est une autre case mémoire qui est utilisée. Elle est initialisée avec valeur true, dans ce bloc la première variable n'est pas accessible, donc la valeur affichée est bien true.

  3. Le second affichage de enoughApple est demandé en dehors du bloc if, la variable enoughApple locale n'existe plus et c'est bien la variable globale, qui vaut toujours false, qui est retournée.

Question

Faut-il obligatoirement initialiser une variable globale (comme pour les constantes), ou est-il possible de les déclarer sans les initialiser (comme pour les déclarations utilisant let) ? Essayez.

Solution

Il est possible de déclarer une variable globale sans l'initialiser (mais ce n'est pas recommandé) qui prendra la valeur undefined jusqu'à ce qu'elle soit affectée.

1
/** JavaScript */
2
var numberApple = 30
3
var enoughApple
4
console.log(numberApple)
5
if(numberApple === 30)
6
{
7
  let enoughApple = true
8
  console.log('A-t-on assez pommes ? (dans le "if")', enoughApple)
9
}
10
console.log('A-t-on assez pommes ? (en dehors du if)', enoughApple)

Question

Qu'affiche le programme suivant ?

1
/** JavaScript */
2
console.log(flowers)
3
var flowers = 25

Solution

Le programme va afficher undefined, car la variable flowers a une portée globale mais seulement à partir de la ligne où elle est définie. En attendant, elle est bien indéfinie.