que descargar definicion javascript oop

descargar - OO Javascript: explicación definitiva del alcance variable



javascript definicion (3)

Las funciones introducen un alcance. Puede declarar funciones dentro de otras funciones, creando así un alcance anidado. El alcance interno puede acceder al alcance externo, pero el externo no puede acceder al alcance interno.

Las variables están vinculadas a un ámbito, utilizando la palabra clave var . Todas las variables están implícitamente vinculadas al ámbito de nivel superior. Entonces, si omite la palabra clave var, se refiere implícitamente a una variable vinculada al nivel superior. En un navegador, el nivel superior es el objeto ventana . Tenga en cuenta que la ventana es una variable auto, entonces window == window.window

¿Puede alguien proporcionar una explicación del alcance variable en JS, ya que se aplica a objetos, funciones y cierres?


Las variables no declaradas con var son de alcance global. Las funciones introducen un alcance, pero tenga en cuenta que si los bloques y otros bloques no introducen un alcance.

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


Variables globales

Cada variable en Javascript es un atributo con nombre de un objeto. Por ejemplo:-

var x = 1;

x se agrega al objeto global. El contexto global proporciona el objeto global y es posible que ya tenga 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;

Variables locales

Ahora que pasa si cambiamos esto a:

function fn() { var x = 1; }

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

Cierre

Ahora vamos a llevar esto más lejos:

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 escribe en stdout en su contexto.

La secuencia que debes obtener es:

1 1 2 2 3 4 3 4

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

Cuando esta función se ejecuta por primera vez, se crea un objeto de ámbito y se agrega un atributo x a ese objeto de ámbito con el valor de 1. También se crea en el mismo objeto de ejecución una función anónima. Cada objeto de función tendrá un atributo de alcance que apunta al contexto de ejecución en el que se crea. Esto crea lo que se conoce como una cadena de alcance que veremos más adelante. Una referencia a esta función la 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 de alcance que apunta a un objeto de ámbito que todavía tiene un atributo x adjunto. Esto se conoce como closure donde el contenido de un contexto de ejecución aún es alcanzable después de que la función para la que fue creado haya completado la ejecución.

Ahora esta misma secuencia ocurre al asignar a fn2 . fn2 apuntará a una función anónima diferente que se creó en un contexto de ejecución diferente que se creó cuando se fnSequence segunda vez.

Cadena de alcance

¿Qué sucede cuando la función mantenida por fn1 se ejecuta la primera vez? Se crea un nuevo contexto de ejecución para la ejecución de la función anónima. Se debe encontrar un valor de retorno a partir del identificador x . El objeto de alcance de la función se inspecciona para un atributo x pero no se encuentra ninguno. Aquí es donde entra la cadena de alcance . Al no haber encontrado x en el contexto de ejecución actual, JavaScript toma el objeto que tiene el atributo de alcance de la función y busca x allí. Lo encuentra dado que el alcance de las funciones se creó dentro de una ejecución de fnSequence , recupera su valor y lo incrementa. Por lo tanto, 1 se emite y la x en este ámbito se incrementa a 2.

Ahora, cuando se ejecuta fn2 , se asocia finalmente a un contexto de ejecución diferente cuyo atributo x es todavía 1. Por lo tanto, la ejecución de fn2 también da como resultado 1.

Como puede ver fn1 y fn1 cada uno genera su propia secuencia independiente de números.