En cada lenguaje de programación, sus variables tienen un cierto rango válido. Después de superar este rango, las variables se volverán inválidas. Este es el alcance de la variable. Desde un punto de vista matemático, es el dominio de variables independientes.
El alcance es el rango accesible de variables, es decir, el alcance controla la visibilidad y el ciclo de vida de las variables y funciones. En JavaScript, los objetos y las funciones también son variables, y las variables se definen dentro del cuerpo de la función arbitraria anidada por la declaración de su cuerpo y el cuerpo de función arbitraria anidada.
1. Alcance estático y alcance dinámico
Alcance estático
Significa que el alcance de la declaración se determina en el tiempo de compilación en función del cuerpo del programa, también conocido como el alcance léxico. La mayoría de los lenguajes de programación modernos adoptan reglas de alcance estático, y JavaScript adopta este alcance.
En los idiomas que usan ámbitos estáticos, las reglas de alcance anidadas más interiores son básicamente: el identificador introducido por una declaración es visible en el alcance donde se encuentra la declaración, y también en cada alcance anidado en el interior, a menos que esté cubierto por otra declaración del mismo nombre identificador anidada en el interior.
Para encontrar el objeto referenciado por un identificador dado, debe encontrarse en el alcance más interno actual. Si se encuentra una declaración, se puede encontrar el objeto referenciado por el identificador. De lo contrario, buscaremos en el alcance externo directo y continuaremos verificando el alcance externo para el exterior hasta que alcancemos el nivel de anidación más externo del programa, es decir, el alcance donde se encuentra la declaración de objeto global. Si no se encuentra ninguna declaración en todos los niveles, entonces el programa tiene un error. como sigue:
function cha () {var name = "xiao;" function chb () {function chc () {console.log (nombre); }}}Primero, la función busca la definición de nombre de chb (), y luego continúa buscando capa por capa. Finalmente, la definición de nombre se encuentra en cha (). Si no se encuentra, se informará un error.
2. Alcance dinámico
En un lenguaje de alcance dinámico, el objeto mencionado por una variable en el programa se determina en función de la información de flujo de control del programa en el momento de la ejecución del programa.
2. El alcance de JavaScript
Hay dos ámbitos en JavaScript, a saber, el alcance global y el alcance local.
1. Alcance global
Hay una definición en cualquier lugar del código. Incluso si una variable global se define en una pieza de código JS anidada en la página HTML, aún se puede acceder a la variable en el archivo JS referenciado. Es muy probable que esto cause contaminación a las variables globales.
Las variables en los siguientes tres casos se considerarán variables globales.
(1) La función más externa y la variable más externa tienen un alcance global
(2) Las variables que se asignan directamente sin definición se declaran automáticamente que tienen alcance global
(3) Las propiedades de todos los objetos de la ventana tienen alcance global
2. Alcance local
Los ámbitos locales generalmente se pueden acceder solo en fragmentos de código fijo, como variables dentro de las funciones (alcance de la función)
var name = "xuxiaOping"; function echoname () {var firstName = "Xu"; // Local Scope SecondName = "Xiao"; // Función de ámbito global echofirstName () {console.log (primer nombre); // xu} console.log (segundoName); return echofirstName;} console.log (nombre); // alcance global var f = echoname (); f (); console.log (firstName); console.log (segundoName);El resultado es:
xuxiaoping
Xiao
Xu // La función interna puede acceder a variables de la función exterior
No seanfined // No se puede acceder a las variables internas de la función fuera de la función
Xiao
JavaScript adjunta variables globales a los objetos de la ventana y se convierte en una propiedad de los objetos de la ventana.
3. Al alcance de la función
Alcance a nivel de bloque: cualquier conjunto de declaraciones en aparatos ortopédicos pertenece a un bloque, y todas las variables definidas en esto son invisibles fuera del bloque de código. La mayoría de los idiomas de clase C tienen ámbitos de nivel de bloque.
Sin embargo, una característica importante de JavaScript es que no tiene un alcance de nivel de bloque.
function echoi () {for (var i = 0; i <10; i ++) {; // console.log (i); } if (true) {var str = "hello"; } console.log (i); console.log (str);} echoi ();El resultado de la salida es:
10
Hola
Se puede ver que fuera de la declaración para For (o si, mientras), la variable que definí en el bloque aún es accesible. Es decir, JavaScript no es compatible con los ámbitos de nivel de bloque, solo admite ámbitos de funciones, y las variables definidas en cualquier lugar de una función son visibles en cualquier lugar de esa función. Como alguien que aprende C y Java desde el principio, esto es un poco difícil de adaptar. Según mis pruebas, lo mismo es cierto para PHP.
Por supuesto, puede usar las características de cierre de JavaScript para simular el alcance de nivel de bloque
function echoi () {(function () {for (var i = 0; i <10; i ++) {; // console.log (i);}}) (); if (true) {var str = "hello"; } console.log (i); console.log (str);} echoi ();El resultado es: INDefinido
Esto aísla la definición de variables. En JS, para evitar conflictos de nombres, las variables globales y las funciones globales deben evitarse tanto como sea posible, por lo que este tipo de cierre se usa de muchas maneras.
4. Ciclo de vida variable de JavaScript
El ciclo de vida de la variable JavaScript se inicializa cuando se declara.
Las variables locales se destruyen después de ejecutar la función.
Las variables globales se destruyen después de que se cierra la página.
3. Javascript Chain de alcance
Parece una cadena, probablemente se puede combinar con la lista vinculada en la estructura de datos.
En JavaScript, las funciones son objetos, pero de hecho, todo en JavaScript es objetos. Los objetos de función, como otros objetos, tienen propiedades a las que se puede acceder a través del código y una serie de propiedades internas a las que solo se pueden acceder al motor JavaScript. Una de las propiedades internas es [[alcance]], definido por la tercera edición del estándar ECMA-262. Estas propiedades internas contienen una colección de objetos en el alcance creado por la función. Esta colección se llama la cadena de alcance de las funciones, que determina a qué datos pueden acceder mediante funciones.
Cuando se crea una función, su cadena de alcance está poblada con objetos de datos que son accesibles en el alcance de la función. Por ejemplo, defina una función como esta:
función add (num1, num2) {var sum = num1 + num2; suma de retorno;}Cuando se crea la función ADD, se llenará un objeto global en su cadena de alcance, que contiene todas las variables globales, como se muestra en la figura a continuación (nota: la imagen solo da algunas de todas las variables):
El alcance de la función ADD se usará durante la ejecución. Por ejemplo, ejecute el siguiente código:
var en total = add (5,10);
Al ejecutar esta función, se crea un objeto interno llamado "contexto de ejecución". El contexto de tiempo de ejecución define el entorno en el que se ejecuta la función. Cada contexto de tiempo de ejecución tiene su propia cadena de alcance para el análisis de identificadores. Cuando se crea el contexto de tiempo de ejecución, su cadena de alcance se inicializa como un objeto contenido en [[Alcance]] de la función de ejecución actual.
Estos valores se copian en la cadena de alcance del contexto de tiempo de ejecución en el orden en que aparecen en la función. Juntos forman un nuevo objeto llamado "Objeto de activación", que contiene todas las variables locales, parámetros con nombre, conjuntos de parámetros y esta función. Entonces este objeto será empujado hacia el extremo frontal de la cadena de alcance. Cuando se destruye el contexto de ejecución, el objeto activo será destruido. La nueva cadena de alcance se muestra en la figura a continuación:
Durante la ejecución de la función, cada vez que se encuentra una variable, se pasará un proceso de análisis de identificadores para decidir dónde obtener y almacenar datos. Este proceso comienza desde la cabeza de la cadena de alcance, es decir, busca un identificador del mismo nombre del objeto activo. Si se encuentra, use la variable correspondiente a este identificador. Si no se encuentra, continúe buscando el siguiente objeto en la cadena de alcance. Si no se encuentran todos los objetos después de buscar, el identificador se considera indefinido. Durante la ejecución de la función, cada identificador debe pasar por dicho proceso de búsqueda.
4. Cadena de alcance y optimización de código
Desde la estructura de la cadena de alcance, se puede ver que en la cadena de alcance del contexto de tiempo de ejecución, cuanto más profundo sea el identificador, más lenta será la velocidad de lectura y escritura. Como se muestra en la figura anterior, debido a que las variables globales siempre existen al final de la cadena de alcance del contexto durante el tiempo de ejecución, es el más lento para encontrar variables globales al analizar el identificador. Por lo tanto, al escribir código, debe intentar usar variables globales lo menos posible y usar variables locales tanto como sea posible. Una buena regla general es: si se hace referencia a un objeto cruzado más de una vez, guárdelo en una variable local antes de usar. Por ejemplo, el siguiente código:
function changeColor () {document.getElementById ("btnchange"). onClick = function () {document.getElementById ("TargetCanvas"). style.backgroundcolor = "rojo"; };}Esta función se refiere al documento variable global dos veces. La variable debe buscarse a través de toda la cadena de alcance hasta que finalmente se encuentre en el objeto global. Este código se puede reescribir de la siguiente manera:
function changeColor () {var doc = document; doc.getElementById ("btnchange"). onClick = function () {doc.getElementById ("TargetCanvas"). style.backgroundcolor = "rojo"; };}Este código es relativamente simple y no mostrará una gran mejora del rendimiento después de la reescritura, pero si se accede a una gran cantidad de variables globales en el programa repetidamente, el rendimiento del código después de la reescritura mejorará significativamente.
5. Con la cadena de alcance de cambio
El contexto de tiempo de ejecución correspondiente es único cada vez que se ejecuta el número, por lo que llamar a la misma función varias veces conducirá a la creación de múltiples contextos de tiempo de ejecución. Cuando se ejecuta la función, el contexto de ejecución será destruido. Cada contexto de tiempo de ejecución está asociado con una cadena de alcance. En términos generales, durante el contexto de ejecución, su cadena de alcance solo se verá afectada por la declaración y la declaración de captura.
La instrucción With es una forma rápida de aplicar objetos para evitar escribir código duplicado. Por ejemplo:
función initui () {con (documento) {var bd = body, links = getElementsBytagName ("A"), i = 0, len = links.length; while (i <len) {update (enlaces [i ++]); } getElementById ("btninit"). onClick = function () {doSomething (); }; }}Use declaraciones de ancho aquí para evitar escribir el documento varias veces, lo que parece más eficiente, pero en realidad crea problemas de rendimiento.
Cuando el código se ejecuta a la declaración con la declaración, la cadena de alcance del contexto de tiempo de ejecución se cambia temporalmente. Se crea un nuevo objeto mutable, que contiene todas las propiedades del objeto especificado por el parámetro. Este objeto será empujado a la cabeza de la cadena de alcance, lo que significa que todas las variables locales de la función ahora están en el segundo objeto de cadena de alcance, por lo que el acceso es más costoso. Como se muestra en la figura a continuación:
Por lo tanto, con las declaraciones deben evitarse en los programas. En este ejemplo, simplemente almacenar el documento en una variable local puede mejorar el rendimiento.
Resumir
1. El alcance de una variable es donde el alcance de la variable es válido.
2. La cadena de alcance de las variables es la colección de objetos en el alcance que se crean.
Lo anterior se trata de este artículo, espero que sea útil para todos aprender la programación de JavaScript.