En la teoría de lenguajes de programación , una variable no local es una variable que no está definida en el ámbito local . Si bien el término puede referirse a variables globales , se utiliza principalmente en el contexto de funciones anidadas y anónimas , donde algunas variables no pueden estar ni en el ámbito local ni en el global .
En Lua se llaman valores superiores de la función. [1]
En el ejemplo de Python 3 que sigue, hay una función anidada inner
definida en el ámbito de otra función outer
. La variable x
es local para outer
, pero no local para inner
(ni tampoco es global):
def exterior (): x = 1 def interior (): no local x x += 1 print ( x ) return interior
En Javascript, la localidad de una variable se determina por la var
declaración más cercana para esta variable. En el siguiente ejemplo, x
es local a , outer
ya que contiene una var x
declaración, mientras que inner
no la contiene. Por lo tanto, x no es local a inner
:
función externa () { var x = 1 ; función interna () { x += 1 ; console . log ( x ); } devolver interna ; }
En el ejemplo de Haskell que sigue, la variable c
no es local en la función anónima \x -> x + c
:
exterior = sea c = 1 en el mapa ( \ x -> x + c ) [ 1 , 2 , 3 , 4 , 5 ]
Las variables no locales son la razón principal por la que resulta difícil admitir funciones anidadas, anónimas, de orden superior y, por lo tanto, de primera clase en un lenguaje de programación.
Si la función o funciones anidadas son recursivas (mutuamente) , se vuelve difícil para el compilador saber exactamente en qué lugar de la pila de llamadas se asignó la variable no local, ya que el puntero de marco solo apunta a la variable local de la función anidada en sí y puede haber una cantidad arbitraria de registros de activación en la pila en el medio. Esto generalmente se resuelve utilizando enlaces de acceso o registros de visualización .
Si la función anidada se pasa como argumento a una función de orden superior, se debe crear un cierre para localizar las variables no locales. Si la función anidada se devuelve como resultado de su función externa (o se almacena en una variable), las variables no locales ya no estarán disponibles en la pila. En su lugar, deben asignarse al montón y su vida útil se extiende más allá de la vida útil de la función externa que las declaró y las asignó. Esto generalmente requiere la recolección de basura.