El ámbito de una variable describe en qué parte del texto de un programa se puede utilizar la variable, mientras que la extensión (o tiempo de vida) describe en qué momento de la ejecución de un programa una variable tiene un valor (significativo). El alcance de una variable es en realidad una propiedad del nombre de la variable, y la extensión es una propiedad de la propia variable. No deben confundirse con el contexto (también llamado entorno), que es una propiedad del programa, y varía según el punto del código fuente o de la ejecución – véase el alcance: una visión general. Además, el tiempo de vida del objeto puede coincidir con el tiempo de vida de la variable, pero en muchos casos no está ligado al tiempo de vida de la variable.
El alcance de un nombre de variable afecta a su extensión.
El alcance es una parte importante de la resolución del nombre de una variable. La mayoría de los lenguajes definen un ámbito específico para cada variable (así como para cualquier otra entidad con nombre), que puede diferir dentro de un programa determinado. El ámbito de una variable es la parte del código del programa para la que el nombre de la variable tiene significado y para la que se dice que la variable es «visible». La entrada en ese ámbito suele iniciar la vida de una variable (cuando entra en contexto) y la salida de ese ámbito suele terminar su vida (cuando sale de contexto). Por ejemplo, una variable con «ámbito léxico» sólo tiene sentido dentro de una determinada función/subrutina o, más concretamente, dentro de un bloque de expresiones/declaraciones (en consecuencia, con ámbito de función o ámbito de bloque); se trata de una resolución estática, realizable en tiempo de análisis o de compilación. Por otro lado, una variable con ámbito dinámico se resuelve en tiempo de ejecución, basándose en una pila de enlace global que depende del flujo de control específico. Las variables a las que sólo se puede acceder dentro de determinadas funciones se denominan «variables locales». Una «variable global», o de alcance indefinido, puede ser referida en cualquier parte del programa.
El alcance, por otro lado, es un aspecto en tiempo de ejecución (dinámico) de una variable. Cada enlace de una variable a un valor puede tener su propia extensión en tiempo de ejecución. La extensión del enlace es la porción del tiempo de ejecución del programa durante el cual la variable continúa refiriéndose al mismo valor o ubicación de memoria. Un programa en ejecución puede entrar y salir de una extensión dada muchas veces, como en el caso de un cierre.
A menos que el lenguaje de programación cuente con recolección de basura, una variable cuya extensión permanentemente sobrepasa su alcance puede resultar en una fuga de memoria, por lo que la memoria asignada para la variable nunca puede ser liberada ya que la variable que se utilizaría para hacer referencia a ella con fines de desasignación ya no es accesible. Sin embargo, se puede permitir que el enlace de una variable se extienda más allá de su ámbito, como ocurre en los cierres de Lisp y en las variables locales estáticas de C; cuando la ejecución vuelve a pasar al ámbito de la variable, ésta puede volver a utilizarse. Una variable cuyo ámbito comienza antes de que lo haga su extensión se dice que no está inicializada y a menudo tiene un valor indefinido y arbitrario si se accede a ella (véase puntero salvaje), ya que todavía no se le ha dado explícitamente un valor concreto. Una variable cuya extensión termina antes de su ámbito puede convertirse en un puntero colgante y ser considerada no inicializada de nuevo, ya que su valor ha sido destruido. Las variables descritas por los dos casos anteriores pueden decirse que están fuera de alcance o desligadas. En muchos lenguajes, es un error intentar utilizar el valor de una variable cuando está fuera de alcance. En otros lenguajes, hacerlo puede dar resultados imprevisibles. Sin embargo, a dicha variable se le puede asignar un nuevo valor, lo que le da una nueva extensión.
Para la eficiencia del espacio, un espacio de memoria necesario para una variable puede ser asignado sólo cuando la variable se utiliza por primera vez y se libera cuando ya no se necesita. Una variable sólo se necesita cuando está en el ámbito, por lo que comenzar el tiempo de vida de cada variable cuando entra en el ámbito puede dar espacio a las variables no utilizadas. Para evitar el desperdicio de este espacio, los compiladores a menudo advierten a los programadores si una variable se declara pero no se utiliza.
Se considera una buena práctica de programación hacer que el ámbito de las variables sea tan estrecho como sea posible para que las diferentes partes de un programa no interactúen accidentalmente entre sí modificando las variables de los demás. Hacer esto también previene la acción a distancia. Las técnicas más comunes para hacerlo son hacer que las diferentes secciones de un programa utilicen diferentes espacios de nombres, o hacer que las variables individuales sean «privadas» a través del ámbito de las variables dinámicas o del ámbito de las variables léxicas.
Muchos lenguajes de programación emplean un valor reservado (a menudo llamado null o nil) para indicar una variable no válida o no inicializada.