1. Alcance de la función
1. Alcance de la función
Significa que el alcance está en una "función", y todas las variables que pertenecen a esta función se pueden usar y multiplexar dentro de todo el alcance de la función.
función foo (a) {var b = 2; function bar () {// ...} var c = 3;} bar (); // console fallido.log (a, b, c); // Los tres fallaronSi se informarán varios identificadores en la función "Foo" anterior si se colocan fuera de la función y se accede.
2. Ejecutar la expresión de la función inmediatamente
Agregar funciones de envoltura fuera de cualquier fragmento de código puede "ocultar" las variables internas y las definiciones de funciones, y el alcance externo no puede acceder a nada dentro de la función de envoltura.
Por ejemplo, la barra anterior, A y otros identificadores. Esto protegerá la variable de la contaminación.
Al escribir complementos, a menudo usa de inmediato para ejecutar expresiones de funciones para proteger las variables dentro.
var a = 2; (function foo () {var a = 3; console.log (a); // 3}) (); console.log (a); // 2El primero () en "foo" convierte la función en una expresión, y el segundo () ejecuta esta función.
Hay un término especial: iife, que representa la expresión de la función invocada inmediatamente;
1. El uso avanzado es llamarlos como función y pasar parámetros en
(función iife (global) {var a = 3; console.log (a); // 3console.log (global.a); // 2}) (ventana);2. Un propósito cambiante es invertir el orden de ejecución del código, que se usa ampliamente en proyectos CMD o AMD.
(función iife (fábrica) {fábrica (ventana);}) (función def (global) {var a = 3; console.log (a); // 3console.log (global.a); // 2});2. Bloqueo de alcance
JavaScript no es compatible con el alcance del bloque.
para (var i = 0; i <10; i ++) {console.log (i);}El "i" en el código anterior es equivalente a lo siguiente
var i; para (i = 0; i <10; i ++) {console.log (i);}Pero hay excepciones, "Try/Catch", Catch es un alcance de bloque.
intente {undefined (); // ejecutar una operación ilegal para forzar una excepción} capt (err) {console.log (err); // puede ejecutarse normalmente! } console.log (err); // referenceError: err no se encuentraES6 ha cambiado el status quo e introdujo una nueva palabra clave LET, que puede unir variables a cualquier alcance (generalmente dentro de {..}). En otras palabras, las variables declaradas para Let implícitamente se encuentran en el alcance del bloque.
3. Mejora
El comportamiento del alcance de la función y el alcance del bloque es el mismo, y se puede resumir como: cualquier variable declarada dentro de un alcance se unirá a este alcance.
1) compilación y ejecución
Todas las declaraciones de variables y funciones se procesarán primero antes de ejecutar cualquier código. Puede ver el siguiente ejemplo de código.
a = 2; var a; console.log (a); // 2
Este código es equivalente a:
var a; // La declaración de definición se realiza en la etapa de compilación a = 2; // La declaración de asignación se dejará en su lugar para esperar la etapa de ejecución console.log (a);
2) Prioridad de la función
La función se promoverá primero, y luego la variable lo será.
foo (); // 1var foo; function foo () {console.log (1);} foo = function () {console.log (2);};La expresión de la función var foo, aunque antes de la declaración de función foo (), es una declaración duplicada (y por lo tanto ignorada), porque la declaración de función se promoverá antes de la variable normal.
Y el código anterior es equivalente a:
function foo () {console.log (1);} foo (); // 1foo = function () {console.log (2);};4. Cierre
Los cierres se refieren a funciones que tienen acceso a variables en otro alcance de la función. La forma más común de crear cierres es crear otra función dentro de una función.
Acceso a las variables locales de esta función a través de otra función, el uso de cierres puede romper el dominio de la cadena de acción y pasar variables y métodos dentro de la función hacia el exterior
Características de cierre:
1. Las funciones están inherentemente anidadas
2. Las funciones internas pueden referirse a parámetros y variables externas
3. Los parámetros y variables no serán recolectados por el mecanismo de recolección de basura
1) Definición
Cuando una función puede recordar y acceder al alcance que se encuentra, se genera un cierre, incluso si la función se ejecuta fuera del alcance actual.
function foo () {var a = 2; function bar () {console.log (a);} barra de retorno;} var baz = foo (); baz (); // 2 - Este es el efecto del cierre.1. Asigne la función "Bar" a "Baz" y ejecute "Baz". El alcance actual no está en el alcance de la "barra", pero se puede ejecutar.
2. El cierre también evitará la recolección de basura. Cuando se ejecuta el "foo", el alcance interno todavía existe. De esta manera, se puede ejecutar el "Baz".
2) pasar la función como parámetro
function foo () {var a = 2; function baz () {console.log (a); // 2} bar (Baz);} Barra de funciones (fn) {fn (); // ¡Este es el cierre! }Pase la función interna Baz a la barra, y cuando se llama (FN) (FN), se puede observar el cierre del alcance interno de foo () que cubre porque puede acceder a.
Si trata una función como un tipo de valor en el primer nivel y la pasa a todas partes, verá la aplicación de cierres en estas funciones.
En temporizadores, oyentes de eventos, solicitudes de AJAX, comunicación de ventana cruzada, trabajadores web o cualquier otra tarea asincrónica (o sincrónica), siempre que se use la función de devolución de llamada, ¡en realidad está utilizando cierres!
3) bucles y cierres
for (var i = 1; i <= 5; i ++) {setTimeOut (function timer () {console.log (i);}, i * 1000);}Cada vez que se imprima, serán 6, y la devolución de llamada de la función de retraso se ejecutará solo al final del bucle.
Según cómo funciona el alcance, la realidad es que, aunque las cinco funciones en el bucle se definen por separado en cada iteración, todas están encerradas en un alcance global compartido, por lo que en realidad solo hay una yo.
Ahora use cierres para implementar las diferentes I imprimiendo cada vez.
for (var i = 1; i <= 5; i ++) {(function (j) {setTimeOut (function timer () {console.log (j);}, j * 1000);}) (i);}IIFE crea ámbitos declarando y ejecutando una función de inmediato. La devolución de llamada en SetTimeOut puede recordar el alcance actual, y el parámetro "J" en cada alcance es diferente.
Lo anterior es una explicación detallada del alcance más confuso, la mejora y el conocimiento de cierre en JavaScript que el editor le presenta. 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!