De reikwijdte van een variabele beschrijft waar in de tekst van een programma de variabele mag worden gebruikt, terwijl de omvang (of levensduur) beschrijft wanneer in de uitvoering van een programma een variabele een (zinvolle) waarde heeft. Het bereik van een variabele is eigenlijk een eigenschap van de naam van de variabele, en de omvang is een eigenschap van de variabele zelf. Deze moeten niet verward worden met context (ook omgeving genoemd), die een eigenschap van het programma is, en varieert per punt in de broncode of uitvoering – zie bereik: een overzicht. Verder kan de levensduur van objecten samenvallen met de levensduur van variabelen, maar in veel gevallen is deze niet gebonden aan de levensduur van variabelen.
De reikwijdte van een variabelenaam beïnvloedt de omvang ervan.
Scope is een belangrijk onderdeel van de naamresolutie van een variabele. De meeste talen definiëren een specifiek bereik voor elke variabele (evenals elke andere benoemde entiteit), die binnen een bepaald programma kan verschillen. Het bereik van een variabele is het deel van de programmacode waarvoor de naam van de variabele betekenis heeft en waarvoor de variabele zogezegd “zichtbaar” is. Binnen dat bereik begint de levensduur van een variabele (als hij in de context komt) en het verlaten van dat bereik beëindigt de levensduur (als hij uit de context gaat). Bijvoorbeeld, een variabele met “lexical scope” heeft enkel betekenis binnen een bepaalde functie/subroutine, of meer bepaald binnen een blok van uitdrukkingen/statements (dienovereenkomstig met function scope of block scope); dit is statische resolutie, uitvoerbaar op parse-tijd of compileer-tijd. Anderzijds wordt een variabele met dynamisch bereik runtime-resolved, gebaseerd op een globale bindingsstapel die afhangt van de specifieke controlestroom. Variabelen die alleen toegankelijk zijn binnen een bepaalde functie worden “lokale variabelen” genoemd. Naar een “globale variabele”, of een variabele met onbepaalde reikwijdte, kan overal in het programma worden verwezen.
Extent, daarentegen, is een runtime (dynamisch) aspect van een variabele. Elke binding van een variabele aan een waarde kan in runtime zijn eigen extent hebben. De omvang van de binding is het deel van de uitvoeringstijd van het programma gedurende welke de variabele naar dezelfde waarde of geheugenplaats blijft verwijzen. Een lopend programma kan een bepaalde omvang vele malen binnengaan en verlaten, zoals in het geval van een closure.
Tenzij de programmeertaal beschikt over garbage collection, kan een variabele waarvan de omvang permanent groter is dan zijn bereik resulteren in een geheugenlek, waarbij het voor de variabele gealloceerde geheugen nooit kan worden vrijgemaakt omdat de variabele die zou worden gebruikt om ernaar te verwijzen voor deallocatie-doeleinden niet langer toegankelijk is. Het kan echter toelaatbaar zijn voor een variabele binding om buiten zijn bereik te reiken, zoals voorkomt in Lisp closures en C statische lokale variabelen; wanneer de uitvoering teruggaat naar het bereik van de variabele, kan de variabele opnieuw worden gebruikt. Een variabele waarvan het bereik begint voordat zijn bereik dat doet, wordt gezegd niet geïnitialiseerd te zijn en heeft vaak een ongedefinieerde, arbitraire waarde als deze wordt benaderd (zie wilde pointer), omdat het nog niet expliciet een bepaalde waarde heeft gekregen. Een variabele waarvan de omvang eindigt voor zijn bereik kan een bungelende pointer worden en weer als ongeïnitialiseerd worden beschouwd omdat zijn waarde is vernietigd. Van variabelen die in de twee voorgaande gevallen worden beschreven, kan worden gezegd dat ze “out of extent” of “unbound” zijn. In veel talen is het een fout om te proberen de waarde van een variabele te gebruiken als deze buiten zijn bereik is. In andere talen kan dit tot onvoorspelbare resultaten leiden. Een dergelijke variabele kan echter een nieuwe waarde worden toegekend, waardoor deze een nieuwe extent krijgt.
Voor ruimte-efficiëntie mag een geheugenruimte die nodig is voor een variabele alleen worden toegewezen wanneer de variabele voor het eerst wordt gebruikt en worden vrijgemaakt wanneer deze niet langer nodig is. Een variabele is alleen nodig als hij binnen het bereik valt, dus het begin van de levensduur van elke variabele als hij binnen het bereik valt, kan ruimte geven aan ongebruikte variabelen. Om verspilling van dergelijke ruimte te voorkomen, waarschuwen compilers programmeurs vaak als een variabele wordt gedeclareerd maar niet wordt gebruikt.
Het wordt beschouwd als een goede programmeerpraktijk om de reikwijdte van variabelen zo smal mogelijk te maken, zodat verschillende delen van een programma niet per ongeluk met elkaar interageren door elkaars variabelen te wijzigen. Dit voorkomt ook actie op afstand. Veelgebruikte technieken om dit te doen zijn om verschillende secties van een programma verschillende naamruimten te laten gebruiken, of om individuele variabelen “privé” te maken door middel van dynamische variabele scoping of lexicale variabele scoping.
Vele programmeertalen gebruiken een gereserveerde waarde (vaak null of nil genoemd) om een ongeldige of ongeïnitialiseerde variabele aan te geven.