El llamado alcance se puede entender simplemente como un alcance (área) que se puede leer y escribir. Algunos estudiantes con experiencia en JS pueden decir: "JS no tiene alcance a nivel de bloque". Además del alcance global, solo las funciones pueden crear ámbitos. Una ventaja del alcance es que puede aislar variables.
Utilizamos algunos ejemplos para ayudarnos a comprender el alcance en JS.
alerta (a); var a = 1;
Si los estudiantes que no conocen el alcance pueden decir que la alerta es 1 o informan un error; Pero en realidad está indefinido;
Hablando de esto, primero hablemos sobre algunas preparaciones realizadas antes de que JS analice el código Line by Line.
Antes de leer el código Line by Line, JS hará un trabajo de "pre-parro" y encontrará algunas "cosas pequeñas" de antemano. Por supuesto, "JS Parser" no encontrará algunos datos casualmente, lo encontrará de acuerdo con VAR, función y parámetros.
"JS Parser" es relativamente "perezoso". Antes de ejecutar oficialmente el código, asignará la variable declarada por VAR a Undefined, es decir, VAR A = Undefined; Considerará toda la función como un bloque de código, independientemente de la cantidad de código que haya. Los parámetros se dirán en los ejemplos más adelante.
Después de que se realizan todos los preparativos, el "Parser JS" comienza a ejecutar el código Line by Line. Ahora, analicemos el ejemplo que comenzamos y es fácil entender por qué está indefinido.
Echemos un vistazo al siguiente ejemplo
alerta (a); var a = 1; alerta (a); var a = 2; alerta (a);
Analicemos esto un poco
Primero "Preparse": el analizador buscará var
Al leer la segunda línea a = indefinido;
Al leer la cuarta línea, todavía a = indefinido;
Ejecución formal de línea por línea:
Alerta de primera línea: indefinido
La segunda línea a = 1;
Alerta de línea 3: 1;
La alerta del quinto elemento: 2
Veamos el ejemplo a continuación
alerta (a); var a = 1; alerta (a); función a () {alerta (2); } alerta (a); var a = 3; alerta (a); función a () {alerta (4); } alerta (a);Analicemos este poco a poco
Primero, "pre-parse": el analizador buscará la función VAR;
Al leer la segunda línea a = indefinido;
Al leer la cuarta línea a = función a () {alerta (2);} // Todas las funciones son el bloque de funciones completas antes de ejecutar oficialmente el código; Cuando una variable encuentra un nombre duplicado, solo queda una variable. Si la variable y la función son el nombre duplicado, solo queda la función.
Al leer la sexta línea, a = función a () {alerta (2);}
Al leer la octava línea, a = función a () {alerta (4);}
Ejecución formal de línea por línea:
Alerta de primera línea: función a () {alerta (4);}
La segunda línea a = 1; // ¡La expresión puede modificar el valor prepasado!
Alerta de línea 3: 1;
La cuarta línea de función no se llama, omita;
La alerta del quinto elemento: 1;
Línea seis a = 3;
Alerta de línea 7: 3
La función de octava línea no se llama, omita;
Alerta de línea 9: 3
Como se muestra en la figura:
Continúe viendo el ejemplo:
var a = 1; función fn1 () {alerta (a); // Undefined var a = 2;} fn1 (); alerta (a); // 1Primero "Preparse": el analizador buscará la función VAR
Al leer la primera línea a = indefinido;
Al leer la segunda línea fn1 = function fn1 () {alerta (2); var a = 2;}
Ejecución formal de línea por línea: Primera línea A = 1;
La llamada de la sexta línea llama, ingrese el alcance de la función y aún pre-parse en el alcance de la función, y luego ejecute It Line by Line.
Preparado dentro de la función: a = indefinido;
Ejecución: alerta: indefinida;
a = 2; // A en este momento es solo un alcance de la función y no afectará a A en el global
La función se ejecuta y regresa al alcance global;
Alerta de línea siete: 1;
continuar:
var a = 1; función fn1 () {alerta (a); // 1 a = 2;} fn1 (); alerta (a); // 2La única diferencia entre el ejemplo anterior es que A en la función no tiene VAR, y solo analiza los puntos clave.
En la alerta de tercera línea (a), en el alcance de la función, dado que no hay var a en la función, el "analizador" buscará un alcance de nivel superior del alcance de la función (la determinación de la relación de nivel superior y de nivel inferior depende del alcance que se creó la función, y bajo el alcance se crea, qué alcance es el nivel inferior). En este momento, el nivel superior de la función es el alcance global. En el alcance global, a = 1, por lo que en este momento, la tercera línea de alerta: 1, y luego la cuarta línea, a = 2 asigna el valor, aún no hay un alcance de función, así que encuentre un alcance en el nivel superior, es decir, el alcance global, y modificar A en el alcance global, por lo que a = 2 hará un ámbito global = 2, por lo que la línea de fera alerta: 2; 2;
Este punto debe entenderse claramente y prestar atención a la diferencia entre VAR o no.
Próximo:
var a = 1; función fn1 (a) {alerta (a); // indefinido a = 2; } fn1 (); alerta (a); // 1La diferencia entre este ejemplo y el anterior es que hay un parámetro adicional. La función del parámetro es equivalente a una variable local, es decir, habrá var a = indefinido en el preparto previo en la función. Por lo tanto, la alerta de tercera línea: indefinida, y la cuarta línea A = 2 cambia la A en el alcance de la función, que no afecta A en el contexto global. La séptima alerta de línea: 1;
entonces:
var a = 1; función fn1 (a) {alerta (a); // 1a = 2;} fn1 (a); alerta (a); // 1Este ejemplo es algo diferente del anterior. Cuando la función se llama en la sexta línea, se pasa un parámetro.
Preste atención a la diferencia entre estos ejemplos y no los confunda.
Otro:
var a = 1; función en () {var a = 2; fn ();} función fn () {alerta (a); // 1} en ();No se declara en FN, y debe tomar el valor en el alcance donde se crea la función: se "crea", no "llama" el alcance de la función.
PD: Conceptos de alcance y contexto en JavaScript
Los ámbitos y los contextos en JavaScript son exclusivos de este idioma, gracias en parte a la flexibilidad que aportan. Cada función tiene un contexto y alcance variables diferentes. Estos conceptos están respaldados por algunos poderosos patrones de diseño en JavaScript. Sin embargo, esto también trae una gran confusión a los desarrolladores. Lo siguiente revela completamente las diferencias en el contexto y el alcance en JavaScript y cómo los usan varios patrones de diseño.
Contexto vs alcance
La primera pregunta que se aclarará es que el contexto y el alcance son conceptos diferentes. A lo largo de los años, he notado que muchos desarrolladores a menudo confunden estos dos términos, describiendo erróneamente uno como el otro. Para ser justos, estos términos se han vuelto muy confusos.
Cada llamada de función tiene un alcance y un contexto asociados con ella. Fundamentalmente, el alcance está basado en funciones y el contexto está basado en objetos. En otras palabras, el alcance está relacionado con el acceso a las variables cada vez que se llama a la función, y cada llamada es independiente. El contexto es siempre el valor de la palabra clave esto, una referencia al objeto que llama al código ejecutable actual.
Lo anterior es el alcance de JavaScript presentado por el editor (recomendado). Espero que te sea útil. Si tiene alguna pregunta, déjame un mensaje y el editor le responderá a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!