« Programmation JavaScript/Variables » : différence entre les versions

Contenu supprimé Contenu ajouté
Touffy (discussion | contributions)
De gros ajouts à propos de la portée des variables
Ligne 2 :
[[Programmation JavaScript/Sommaire| << Retour au sommaire détaillé]] / [[Programmation JavaScript/Opérateurs|Opérateurs >>]]
 
Les variables permettent d'instancier un typeobjet et de manipuler cette instance à l'aide d'un identificateur (le nom de la variable). Néanmoins,Tous javascriptles identificateurs en JavaScript sont des références à un objet. Javascript étant un langage au typage dynamique, ille esttype possibledes deobjets déclarern'est despas variablesdéclaré sansexplicitement leset il peut typerchanger immédiatementautomatiquement.
==Typage dynamique==
Javascript est, contrairement à c, à '''typage dynamique'''. Comme basic.<br/>
Il est donc possible de déclarer une variable sans lui définir de type. Ou plutôt, une variable déclarée de telle manière sera du type undefined.<br/>
Tout au long de son utilisation, cette variable pourra changer de type sans que l'interpréteur n'y trouve rien à redire.
<pre>
var ma_versatile; // est undefined
ma_versatile = "Je deviens une chaîne"; // estdevient string
ma_versatile = 5; // deviensdevient number
ma_versatile = new Array(); // deviensdevient tableauobject
</pre>
Il n'est en fait pas nécessaire de déclarer une variable (avec le mot-clé '''var'''). La différence est expliquée ci-après.
 
==Identificateur==
Les règles d'élaboration des identificateurs sont décrites à [[Programmation JavaScript/Identificateurs|ce lien]].
Pour résumer, les identificateurs comportent des caractères alphanumériques et le tiret soulignant (_). Ils ne peuvent commencer par un chiffre, et les majuscules comptent.
 
==Portée==
===Variables globalesPropriétés===
L'instanciation directe (sans mot-clé var) d'un objet avec un identificateur donne souvent l'impression de créer une variable globale. En réalité, la notion de "variable globale" n'existe pas en JavaScript. Toutes les variables sont, sauf quand on les déclare avec '''var''', des propriétés d'un objet. Par défaut, cet objet est implicitement l'objet '''window''' (et non, '''window''' n'est pas une variable globale qui ferait exception à la règle car il est une de ses propres propriétés, c'est-à-dire que '''window''' est une propriété de '''window''').
L'instanciation directe (sans mot réservé var) d'un type avec un identificateur crée une variable globale.
 
Comme '''window''' reste l'objet implicite la plupart du temps, une variable créée ainsi pourra être employée comme si elle était globale :
<pre>
ma_variable = "une valeur";
 
function maFonction()
{
mon_autre_variable = "une autre valeur"
}
 
alert(mon_autre_variable) // affiche "une autre valeur"
</pre>
La variable mon_autre_variable est certes déclarée dans une fonction, mais il faut lire "window.mon_autre_variable" donc c'est une propriété de window et elle ne sera pas détruite automatiquement à la fin de la fonction.
En javascript comme dans tous les langages informatiques, les variables globales sont à manier avec précaution car elles peuvent être modifiées par n'importe quelle script ou n'importe quelle partie du script, et conduire à des résultats inattendus. Ceci est favorisé par les caractéristiques de typage dynamique du langage...
Néanmoins, si l'on a besoin d'une variable globale, on peut la définir
* en dehors d'une fonction, (dans le script principal ou dans le corps de la page html), avec ou sans mot réservé var.
* à l'intérieur d'une fonction en omettant le mot réservé var.
Notons que cette dernière pratique est plus que douteuse, mais possible. On obtiens alors une variable globale indésirable, au comportement imprévisible.
<pre>
<script>
var glo_1 = "globale 1"; // Déclarée dans le scope global, est globale
glo_2 = "globale 2"; // Idem, sans mot réservé var
 
===Sous-entendre un objet===
function foo() // Une fonction chargée d'affecter une valeur à glo_3
 
Pour économiser du code, il peut être intéressant de sous-entendre un autre objet que '''window'''. Cela se fait explicitement avec un bloc '''with'''. Sous-entendre un objet ne le rend pas systématiquement implicite. La résolution se fait aussitôt qu'une des conditions suivantes est remplie :
* l'identificateur est une propriété existante de l'objet sous-entendu
* l'identificateur est une variable locale
* l'identificateur est une propriété existante de l'objet implicite s'il est différent de window
* l'identificateur est une propriété existante de window
 
Si aucune condition n'est remplie et que l'expression affecte une valeur à la variable, cette variable est créée comme propriété de l'objet sous-entendu. Si l'expression ne fait qu'utiliser la valeur, elle retournera simplement '''undefined'''.
 
<pre>c=true
d="propriété de window"
 
with(monObjet)
{
a=2
glo_3 = "globale 3";
b="texte"
c=false // window.c existe donc va être utilisé
// pour éviter que window.d soit utilisé, il faut être explicite
monObjet.d="propriété de monObjet"
}
 
alert(glo_1a); // Affichea n'est "globalepas 1"défini
alert(glo_2monObjet.a); // Afficheaffiche "globale 2"
 
foo(); // Effectue l'affectation à glo_3
alert(glo_3c); // Afficheaffiche "globale 3false". Elle est donc globale.
 
</script>
alert(d) // affiche "propriété de window"
alert(monObjet.d) // affiche "propriété de monObjet"
</pre>
 
===Variables locales===
A l'aide dude motla réservéprimitive '''var''', il est possible de définir une variable. Lalocale, portéequi den'est cettepas variableune dépendpropriété de ld'endroitun autre elleobjet. estCette définie.déclaration Déclaréepeut avoir lieu n'importe où dans le corps d'une fonction, lapas variablenécessairement seraau localedébut, mais seules les utilisation ultérieures de l'identificateur feront référence à la fonctionvariable locale puisqu'elle n'existait pas avant.
 
Comme toute variable locale, elle est automatiquement détruite à la fin de la fonction, bien que sa valeur puisse être sauvegardée dans certains cas. Par contre, elle ne peut pas être détruite par la primitive '''delete'''.
 
<pre>
function foo()
Ligne 60 ⟶ 85 :
alert(loc_2); // Provoque une erreur
</pre>
 
Si le mot-clé '''var''' est utilisé en-dehors de toute fonction, la variable sera utilisable dans tout le script.
 
==Types==
Javascript est faiblement typé, mais typé quand même. Voici une revue des types que peux prendre une variable. Il est possible à tout moment de vérifier le type avec le mot réservé '''typeof'''.
 
===undefined===
Une variable est du type undefined dans trois cas: