javascript scope-chain

Cadena de alcance en Javascript



scope-chain (5)

He leído la cadena de alcance en Javascript, pero no tenía ningún sentido para mí, ¿podría alguien decirme qué es la cadena de alcance y cómo funciona con un gráfico o algo que incluso un idiota puede entender? Busqué en Google pero no encontré algo comprensible :(

Gracias por adelantado.


Cualquier función en ECMAScript (lenguaje base en el que se basa JS) es un contexto de ejecución separado, y se ejecuta individualmente el uno del otro. Dentro de cada contexto de ejecución, this refiere al objeto en cuestión, por defecto a cualquier función a la que esté asociada.

function foo() { alert(this===window) }

Alertaría verdadero, porque la ventana es el objeto que posee el método ''foo''. Se accede a todas las variables definidas en una función a través del entorno de la cadena de alcance única de esa función.

function world() { var name = ''global''; alert(name) }

alertaría ''global'' obviamente.

function world() { var name = ''global''; (function() { var name = ''country''; alert(name) })(); alert(name) }

En el último ejemplo, cuando se invoca la primera alerta, Javascript determina que en la cadena de alcance de la función interna que el name del identificador está definido, por lo que no tiene que buscar la cadena de alcance para tomarla.

En la segunda invocación de alerta, el name también se define en el mismo contexto y las alertas ''global'';

function world() { var name = ''global''; (function() { alert(name) })(); }

En este ejemplo, el identificador de name no está definido en el mismo contexto y, por lo tanto, tiene que desplazarse por la cadena de ámbito hasta la función externa donde se define el nombre, y alerta global.

Referencia:



Para comprender la cadena de alcance, debe saber cómo funcionan los cierres.

Cuando se anidan funciones, se forma un cierre, las funciones internas pueden referirse a las variables presentes en sus funciones externas de inclusión incluso después de que sus funciones principales ya se hayan ejecutado.

JavaScript resuelve los identificadores dentro de un contexto particular atravesando la cadena del alcance, pasando de localmente a globalmente.

Considere este ejemplo con tres funciones anidadas:

var currentScope = 0; // global scope (function () { var currentScope = 1, one = ''scope1''; alert(currentScope); (function () { var currentScope = 2, two = ''scope2''; alert(currentScope); (function () { var currentScope = 3, three = ''scope3''; alert(currentScope); alert(one + two + three); // climb up the scope chain to get one and two }()); }()); }());

Lecturas recomendadas:


Sé que es una publicación anterior, pero sigue siendo útil para los desarrolladores. Quería hacerlo de otra manera, ya que sería más fácil para los principiantes entender el encadenamiento de alcance. Aquí está mi versión modificada del código:

var currentScope = 0; // global scope function a () { var currentScope = 1, one = ''scope1''; alert(currentScope); function b () { var currentScope = 2, two = ''scope2''; alert(currentScope); function c () { var currentScope = 3, three = ''scope3''; alert(currentScope); alert(one + two + three); // climb up the scope chain to get one and two } c(); } b(); } a();


Cadena de alcance en Javascript explicada en términos simples

Alex es un tipo feliz. Un buen día, caminando por la calle con su salario mensual en la mano, es asaltado.

Más tarde se da cuenta de que mañana es el último día para pagar la matrícula de sus hijas de 1000 $.
Él corre a su casa, encuentra sus ahorros de $ 400, preocupaciones por el resto ($ 600). El pensamiento inmediato que destella, es tomar prestado algunos de su padre Mathew.
Mathew, el pobre carpintero, sin dinero, vende su pulsera heredada por 300 $ y se la presta a su hijo Alex.
Alex tiene una buena reputación en la sociedad, obtiene los 300 $ restantes de un banco local de inmediato y le paga la matrícula de su hija a tiempo.

Volviendo a la cadena Scope en Javascript:
Función Alex-A en javascript
Mathew: la función inmediata, Alex está anidado.
Padres Mathews: la función inmediata en la que está anidado Mateo.
Variables bancarias globales

function Bank() { loan=300; Mathew(); function Mathew() { mathew=300; Alex(); function Alex() { savings:400; alert(''I need some money''); } } } Bank();

La cadena de alcance de Alex en este punto se ve así: [ahorro: 400] + [anatema: 300] + [préstamo: 300];