19 votos

OO Javascript : explicación Definitiva de la variable de alcance

Alguien puede dar una explicación de la variable de alcance en JS como se aplica a los objetos, las funciones y los cierres?

35voto

AnthonyWJones Puntos 122520

Las variables globales

Cada una de las variables en Javascript es el nombre de un atributo de un objeto. Por ejemplo:-

var x = 1;

x se añade al objeto global. El objeto global es proporcionada por la secuencia de comandos de contexto y ya puede tener un conjunto de atributos. Por ejemplo en un navegador el objeto global es la ventana. Un equivalente a la línea anterior en un navegador sería:-

window.x = 1;

Las variables locales

Ahora lo que si podemos cambiar esto:-

function fn()
{
    var x = 1;
}

Cuando fn se llama se crea un nuevo objeto llamado el contexto de ejecución también se conoce como el alcance (yo uso estos términos indistintamente). x se agrega como un atributo a este ámbito objeto. Por lo tanto, cada llamada a fn tendrá su propia instancia de un objeto de ámbito y, por tanto, su propia instancia del atributo x adjunto a ese ámbito objeto.

Cierre

Ahora vamos a dar un paso más:-

function fnSequence()
{
    var x = 1;
    return function() { return x++; }
}

var fn1 = fnSequence();
var fn2 = fnSequence();

WScript.Echo(fn1())
WScript.Echo(fn2())
WScript.Echo(fn1())
WScript.Echo(fn2())
WScript.Echo(fn1())
WScript.Echo(fn1())
WScript.Echo(fn2())
WScript.Echo(fn2())

Nota: Reemplace WScript.Echo , con lo que se escribe en stdout en su contexto.

La secuencia que debe conseguir es :-

1 1 2 2 3 4 3 4

Entonces, ¿qué ha ocurrido aquí? Tenemos fnSequence que inicializa una variable x a 1 y devuelve una función anónima que se devolverá el valor de x y luego se incrementa.

Cuando esta función se ejecuta en primer lugar un ámbito objeto es creado y un atributo x es añadido para que alcance el objeto con el valor de 1. También se crea en la misma ejecución del objeto es una función anónima. Cada objeto de la función tendrá un atributo scope que apunta a la ejecución del contexto en el que es creado. Esto crea lo que se conoce como un ámbito de la cadena que nos va a venir más tarde. Una referencia a esta función devuelve fnSequence y se almacena en fn1.

Tenga en cuenta que fn1 ahora apunta a la función anónima y que la función anónima tiene un atributo scope que apunta a un objeto de ámbito que todavía tiene un x atributo adjunta. Esto se conoce como closure donde el contenido de un contexto de ejecución sigue siendo accesible después de la función para lo que fue creada ha completado la ejecución.

Ahora esta misma secuencia que ocurre cuando se asigna a fn2. fn2 apunta a una diferente función anónima que fue creado en un diferente contexto de ejecución que se crea cuando fnSequence fue llamado este segundo tiempo.

El Alcance De La Cadena De

¿Qué sucede cuando la función celebrada por fn1 se ejecuta la primera vez? Un nuevo contexto de ejecución creadas para la ejecución de la función anónima. Un valor de retorno se encuentra desde el identificador x. La función del alcance del objeto inspeccionado por un x atributo pero no encuentra ninguno. Aquí es donde el alcance de la cadena . Al no haber podido encontrar x en el actual contexto de ejecución de JavaScript se lleva el objeto a cabo por la función del atributo scope y busca x no. Se encuentra desde las funciones del ámbito de aplicación fue creada dentro de la ejecución de fnSequence, recupera su valor y de los incrementos de él. Por lo tanto 1 es la salida y el x en este ámbito se incrementa a 2.

Ahora, cuando fn2 se ejecuta en última instancia es conectado a un diferente contexto de ejecución cuyas x atributo es todavía 1. Por lo tanto la ejecución de fn2 también se traduce en 1.

Como se puede ver fn1 y fn2 cada uno genere su propia independiente de la secuencia de números.

4voto

gizmo Puntos 8528

Douglas puede!

4voto

jmnben Puntos 451

Las Variables no se declaran con el var son de alcance mundial. Funciones de introducir un ámbito, pero tenga en cuenta que si los bloques y otros bloques no introducir un ámbito.

También pude ver mucha información sobre esto por Google Javascript alcance. Eso es realmente lo que yo recomendaría. http://www.digital-web.com/articles/scope_in_javascript/

2voto

Dave Ward Puntos 36006

Es difícil superar Crockford: http://www.crockford.com/javascript/private.html

1voto

troelskn Puntos 51966

Funciones de introducir un ámbito. Se pueden declarar funciones dentro de otras funciones, creando un entramado alcance. El interior del ámbito de aplicación puede acceder al alcance externo, pero el exterior no se puede acceder al interior del ámbito.

Las Variables están limitadas a un ámbito de aplicación, utilizando el var de la palabra clave. Todas las variables están implícitamente ligado a la parte superior del nivel de alcance. Así que si usted omite la palabra clave var, está refiriéndose implícitamente a una variable dependiente del nivel superior. En un navegador, el nivel superior es la ventana de objetos. Tenga en cuenta que la ventana es en sí una variable, de forma que la ventana == ventana.ventana

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X