La portée d’une variable décrit où dans le texte d’un programme la variable peut être utilisée, tandis que l’étendue (ou durée de vie) décrit quand dans l’exécution d’un programme une variable a une valeur (significative). La portée d’une variable est en fait une propriété du nom de la variable, et l’étendue est une propriété de la variable elle-même. Il ne faut pas les confondre avec le contexte (également appelé environnement), qui est une propriété du programme, et varie selon le point du code source ou de l’exécution – voir scope : an overview. De plus, la durée de vie des objets peut coïncider avec celle des variables, mais dans de nombreux cas, elle n’est pas liée à la durée de vie des variables.
La portée d’un nom de variable affecte son étendue.
La portée est une partie importante de la résolution du nom d’une variable. La plupart des langages définissent une portée spécifique pour chaque variable (ainsi que pour toute autre entité nommée), qui peut différer au sein d’un programme donné. La portée d’une variable est la partie du code du programme pour laquelle le nom de la variable a une signification et pour laquelle la variable est dite « visible ». L’entrée dans cette portée commence généralement la vie d’une variable (lorsqu’elle entre dans le contexte) et la sortie de cette portée termine généralement sa vie (lorsqu’elle sort du contexte). Par exemple, une variable avec une « portée lexicale » n’a de sens qu’à l’intérieur d’une certaine fonction/sous-routine, ou plus finement à l’intérieur d’un bloc d’expressions/états (en conséquence avec une portée de fonction ou une portée de bloc) ; il s’agit d’une résolution statique, réalisable au moment de l’analyse ou de la compilation. En revanche, une variable à portée dynamique est résolue au moment de l’exécution, sur la base d’une pile de liaison globale qui dépend du flux de contrôle spécifique. Les variables uniquement accessibles à l’intérieur d’une certaine fonction sont appelées « variables locales ». Une « variable globale », ou une variable à portée indéfinie, peut être référencée partout dans le programme.
L’étendue, en revanche, est un aspect d’exécution (dynamique) d’une variable. Chaque liaison d’une variable à une valeur peut avoir sa propre étendue au moment de l’exécution. L’étendue de la liaison est la portion du temps d’exécution du programme pendant laquelle la variable continue à se référer à la même valeur ou au même emplacement mémoire. Un programme en cours d’exécution peut entrer et sortir d’une étendue donnée de nombreuses fois, comme dans le cas d’une fermeture.
À moins que le langage de programmation ne dispose d’un garbage collection, une variable dont l’étendue dépasse de façon permanente son champ d’application peut entraîner une fuite de mémoire, la mémoire allouée pour la variable ne pouvant jamais être libérée puisque la variable qui serait utilisée pour la référencer à des fins de désallocation n’est plus accessible. Toutefois, il peut être permis qu’une liaison de variable s’étende au-delà de sa portée, comme c’est le cas dans les fermetures Lisp et les variables locales statiques C ; lorsque l’exécution revient dans la portée de la variable, celle-ci peut à nouveau être utilisée. Une variable dont la portée commence avant son étendue est dite non initialisée et a souvent une valeur indéfinie et arbitraire si on y accède (voir pointeur sauvage), puisqu’on ne lui a pas encore donné explicitement une valeur particulière. Une variable dont l’étendue se termine avant son champ d’application peut devenir un pointeur flottant et être considérée comme non initialisée une fois de plus puisque sa valeur a été détruite. On peut dire que les variables décrites par les deux cas précédents sont hors d’étendue ou non liées. Dans de nombreux langages, c’est une erreur d’essayer d’utiliser la valeur d’une variable lorsqu’elle est hors d’étendue. Dans d’autres langues, cela peut donner des résultats imprévisibles. Une telle variable peut cependant se voir attribuer une nouvelle valeur, ce qui lui donne une nouvelle extent.
Pour des raisons d’efficacité spatiale, un espace mémoire nécessaire à une variable peut être alloué uniquement lorsque la variable est utilisée pour la première fois et libéré lorsqu’elle n’est plus nécessaire. Une variable n’est nécessaire que lorsqu’elle est dans l’étendue, donc commencer la vie de chaque variable lorsqu’elle entre dans l’étendue peut donner de l’espace aux variables inutilisées. Pour éviter de gaspiller un tel espace, les compilateurs avertissent souvent les programmeurs si une variable est déclarée mais non utilisée.
Il est considéré comme une bonne pratique de programmation de rendre la portée des variables aussi étroite que possible afin que les différentes parties d’un programme n’interagissent pas accidentellement les unes avec les autres en modifiant les variables des autres. Cela permet également d’éviter les actions à distance. Les techniques courantes pour ce faire consistent à faire en sorte que les différentes sections d’un programme utilisent différents espaces de noms, ou à rendre les variables individuelles « privées » par le biais de la délimitation dynamique de la portée des variables ou de la délimitation lexicale de la portée des variables.
De nombreux langages de programmation emploient une valeur réservée (souvent nommée null ou nil) pour indiquer une variable invalide ou non initialisée.