馃 Scope

馃嵖 驴Qu茅 es el scope?

El scope para una variable, m茅todo, clase, etc, es todo lugar aquel donde dicho elemento puede ser utilizado, en base al lugar en donde fue definido.

  1. Vamos a crear una funci贸n que salude.
function saludar() {
    console.log('Hola amigo!');
}
saludar();
  1. Y tambi茅n podemos asignar por referencia una funci贸n a una variable.
var saludar = function () {
    console.log('Hola amigo');
};

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

saludar();

Esto equivale exactamente al paso 2.

  1. Y si ya tenemos una expresi贸n y sabemos que dicha expresi贸n regresa una funci贸n, podemos invocarla directamente as铆 (expresion)() para que esta se ejecute.
// 06_scope/01_funcion_autoexecutable.js
(function () {
    console.log('Hola amigo');
})();

O de esta forma…

// 06_scope/01_funcion_autoexecutable.js
(function () {
    console.log('Hola amigo');
}());
  1. Ahora supongamos que el mensaje fuese din谩mico, queremos que el texto del saludo sea transferido a la impresi贸n seg煤n 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.

  1. 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, as铆 que dichas variables no pueden ser utilizadas fuera de la funci贸n que las contiene.

  1. Para completar el ejercicio, vamos a simplificarnos aun m谩s, as铆 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.

(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.