Hola de nuevo Ya escribimos que a fines de septiembre en OTUS se iniciará una nueva transmisión del curso
"Fullstack JavaScript Developer" . En previsión del comienzo de las clases, continuamos compartiendo con usted artículos de derechos de autor preparados especialmente para los estudiantes del curso. Hoy veremos los tipos de contexto en JavaScript. Vamos
Autor del artículo: Pavel Yakupov
El propósito de este artículo es que el lector entienda los conceptos básicos de los ámbitos que se utilizan en JavaScript.
El alcance es una de las cosas más importantes en JavaScript (y tiene un lugar en la mayoría de los lenguajes de programación modernos). El alcance está asociado con la larga vida de una variable o función, el acceso, la visibilidad de las variables y algunas otras cosas.
¿Por qué necesitamos este alcance?
El alcance en los lenguajes de programación realiza las siguientes funciones:
Seguridad (encapsulación): las variables y funciones están disponibles solo cuando son necesarias.
Elimina el conflicto de nombres de variables. La presencia de ámbitos le permite no "volcar" todas las variables en un montón, simulando espacios de nombres (espacio de nombres).
Reutilización del código: el código escrito se puede utilizar, evitando efectos "extraños".
Tipos de alcances
En el nivel más simple, en JavaScript hay dos ámbitos: local y global.
En este artículo, también tocaremos un ámbito como léxico y bloque.
Alcance global
Cuando abre un documento en JavaScript y comienza a escribir código, entra en el ámbito global.
Todo lo que se crea en el ámbito global (variables, funciones) es accesible desde cualquier parte del programa. Además, las variables globales están disponibles todo el tiempo que su aplicación se está ejecutando y se eliminan solo cuando el programa finaliza su trabajo.
Muchos recién llegados al principio usan variables globales con demasiada frecuencia; esto es algo más fácil de programar, pero esto se considera una mala práctica, y a menudo conduce a programas inestables que finalmente usan mucha más memoria de la que realmente necesitan. Después de todo, si las variables se encapsularan de manera confiable dentro de las funciones en las que se usan, al final de la función, se eliminarían de la memoria usando el recolector de basura y dejarían de ocupar la memoria del cliente, que no es infinita.
Alcance local
Las variables que se declaran localmente solo están disponibles en el ámbito donde se declararon.
La forma más fácil de crear un nuevo ámbito es crear una nueva función. Una variable creada dentro de una función solo es accesible desde el interior. Además, el alcance local se puede obtener usando el alcance de bloque (se discutirá más adelante).
function foo(){ let x = 15; } //console.log(x); error { let y = 14; } // console.log(y); error { var z = 13; } console.log(z); // var , // // - 13
Alcance léxico
Entonces, ¿qué es el alcance léxico? En términos simples, esta es la capacidad de una función interna para acceder a un ámbito externo. Aquí vale la pena recurrir a la práctica de los cierres. Probablemente puedas escribir un par de artículos más sobre ellos, pero rápidamente te daré un ejemplo clásico:
sum(5)(5) // ? function sum(a){ var add = function(b){ return a+b; } return add; } console.log(sum(5)(5)); // 10 //
Alcance del bloque
Hasta ahora, solo hemos discutido los ámbitos que están asociados con la operación de funciones y llaves {}, y hemos discutido las diferencias en la operación de var y solo de manera indirecta.
¿Cómo funciona la directiva var? Cuando se declara una variable utilizándola en el ámbito global, el nombre de la variable se asigna como una propiedad al objeto de ventana global (si nos referimos al navegador) y permanece allí todo el tiempo que se ejecuta el programa. Al mismo tiempo, como un alcance de bloque, como {} (y if, for, while y todos los demás se incluyen de forma bastante lógica).
Además, hay otra característica de let y const: declarada en el mismo alcance, entonces no pueden declararse nuevamente en el mismo alcance (bueno, la insatisfacción del intérprete parece bastante lógica aquí).
let x = 15; console.log(x); // { let x = 16; // console.log(x) // let x = 17; // , }
nueva función
Características del alcance al declarar una nueva función como "nueva función". Esta opción para crear una función rara vez se usa, pero a veces puede ser necesaria.
Ejemplo de sintaxis:
//let newFunc = new Function([arg1, arg2…argN], functionBody); let mult = new Function('a', 'b', 'return a * b'); console.log(mult(3,4));
Por lo general, una función recuerda dónde nació (entorno léxico), pero cuando se crea una función utilizando la nueva construcción de función, no escribe las variables de entorno que la rodean, como en una situación normal, sino solo aquellas declaradas globalmente.
// , ()() let a = 3; function outerFunc() { var a = 2; var func = new Function('console.log(a*a)'); return func; } outerFunc()(); // 9, window
Elevación (aumento de variables)
Discutiendo el alcance, no pudimos tocar el tema de elevar el alcance de las variables. El intérprete que lee el código en realidad lo lee dos veces: lee las funciones declaradas como función declaraton y lee las variables globales declaradas globales con la variable var. Sin embargo, las variables se registran no por sus valores declarados, sino por el valor indefinido.
console.log(x); // undefined var x = 15; console.log(y);// error let y = 13;
Deje que este tema solo se relacione indirectamente con áreas de visibilidad, pero a veces este conocimiento puede ser útil.
Gracias a todos! ¡Espero que este artículo haya sido útil para alguien!
Enlaces de interés:developer.mozilla.org/en-US/docs/Glossary/Scopedeveloper.mozilla.org/en/docs/Web/JavaScript/Closures2ality.com/2015/02/es6-scoping.htmllearn.javascript.ru/new-functionhabr.com/en/company/otus/blog/466873