馃 Scope.

Scope para una variable, metodo, clase, etc, es todo lugar aquel donde dicho elemento puede ser utilizado, en base al lugar en donde fue definido.

  1. Vamosa crear una funci贸n que salude.

    function saludar() {
        console.log('Hola amigo!');
    }
    saludar();
    
  2. Y tambien podemos asinar por referencia una funci贸n a una variable.

    var saludar = function () {
        console.log('Hola amigo');
    };
    
    saludar();
    
  3. Y podemos incluso encerrar la asignaci贸n dentro de parentesis, esto es convertir la asignaci贸n en una expresi贸n.

    var saludar = (function () {
        console.log('Hola amigo');
    });
    
    saludar();
    

    Esto equivale exactamente al paso 2.

  4. Y si ya tenemos una expresion y sabemos que dicha expresi贸n reqgresa una funci贸n, podemos invocarla directamente asi (expresion)() para que esta se ejecute.

    // 06_scope/01_funcion_autoexecutable.js
    (function () {
        console.log('Hola amigo');
    })();
    

    o

    // 06_scope/01_funcion_autoexecutable.js
    (function () {
        console.log('Hola amigo');
    }());
    
  5. Ahora supongamos que el mensaje fuese din谩mico, queremos que el texto del saludo sea transferido a la impresi贸n segun el valor de una variable.

    // 06_scope/01_funcion_autoexecutable.js
    var saludo = 'Hola amigo';
    
    (function () {
        console.log(saludo);
    }());
    

    Si ejecutamos el anterior c贸digo, en efecto, el mensaje impreso ser谩 Hola amigo.

    Las funciones pueden acceder a variables cuyo scope sea aquel que las contiene.

  6. Ahora supongamos que cambiamos un poco nuestro c贸digo para definir el mensaje de despedida dentro de la funci贸n y su impresi贸n fuera de esta.

    // 06_scope/01_funcion_autoexecutable.js
    var saludo = 'Hola amigo';
    
    (function () {
        console.log(saludo);
        var despedida = 'Adios amigo';
    }());
    
    console.log(despedida);
    

    Node va a responder lo siguiente…

    ReferenceError: despedida is not defined
    

    Las variables definidas dentro de una funci贸n tienen un scope exclusivo dentro de esta funci贸n, asi que dichas variables no pueden ser utilizadas fuera de la funci贸n que las contiene.

  7. Para completar el ejercicio, vamos a simplificarnos aun m谩s, asi introduciremos el concepto argumento > parametro.

    // 06_scope/01_funcion_autoexecutable.js
    (function (saludo) {
        console.log(saludo);
    }('Hola amigo'));
    

    La funci贸n autoinvocable que hemos definido tiene 1 argumento llamado saludo, y cuando la invocamos le pasamos un par谩metro que es un string Hola amigo.

    Para entender la diferencia entre argumento y par谩metro basta entender lo siguiente…

    var saludar = function(argumento) { console.log(argumento) } // las funciones se definen con argumentos
    saludar(parametro) // las funciones se invocan con p谩rametros
    

Lo que Nodejs hace cuando creamos un m贸dulo, es encapsular el modulo dentro de una funci贸n autoexecutable como la que hemos ejemplificado.

```js
(function(){
    var saludar = function(saludo){
        // .... codigo de la funcion
    }
    module.exports = saludar;
});

return module.exports;
```

Al final como vemos, regresa module.exports que es lo que obtenemos al importar el modulo var saludar = require('./saludar').

Esta es la metodolog铆a mediante la cual los m贸dulos mantienen sus variables dentro de su scope, y asi nodejs previene por ejemplo que variables y funciones colapsen entre si.

Asignaci贸n por valor vs referencia. JSON.
comments powered by Disqus