Ámbitos anidados

Cuando se declara una variable, dicha variable esta disponible en cualquier lugar del ámbito, como en cualquier ámbito inferior/interior. Por ejemplo

function foo() {
    var a = 1;

    function bar() {
        var b = 2;

        function baz() {
            var c = 3;

            console.log( a, b, c ); // 1 2 3
        }

        baz();
        console.log( a, b );        // 1 2
    }

    bar();
    console.log( a );               // 1
}

foo();

Observe que c no esta disponible dentro de bar(), ya que c es declarada solo dentro del ámbito de baz(), y la b no esta disponible para foo() por la misma razón.

Si usted trata de acceder a valores de variables en ámbitos donde no están disponibles, usted obtendrá el lanzamiento de un ReferenceError. Si usted trata de establecer una variable que no ha sido declarada, usted terminara ya sea creando una variable global (mal!!) u obteniendo un error, depende del modo estricto "stric mode". Echemos un vistaso.

function foo() {
    a = 1;  // `a` no declarada formalmente
}

foo();
a;          // 1 -- oops, variable global :(

Esto es una muy mala practica. No lo haga! Siempre declare formalmente sus variables.

Ademas de declarar variables a nivel de una función, ES6 deja declarar variables que pertenecen a bloques individuales usando la palabra clave let. Aparte de algunos detalles matizados, las reglas de ámbito se comportan más o menos del mismo modo al que acabamos de ver con las funciones.

function foo() {
    var a = 1;

    if (a >= 1) {
        let b = 2;

        while (b < 5) {
            let c = b * 2;
            b++;

            console.log( a + c );
        }
    }
}

foo();
// 5 7 9

Ya que usamos let en lugar de var, b pertenecerá solo a la sentencia if y no a todo el ámbito de la función foo(). Del mismo modo c pertenece solo a el bucle while. El ámbito de bloque es muy útil para manejar el alcance de sus variables en un modo mas estricto, lo que con el tiempo puede hacer el código mucho mas fácil de mantener.

results matching ""

    No results matching ""