Supongamos que un “actor” quiere hacer audición en un estudio para participar en la nueva Película taquillera, no obstante el director solo es fan de Jim Carrey y Leonardo Dicaprio, (el tiene memoria de los papeles que interpreta el actor a pesar de que ya termino la “audición”.

function audicion (nombre) {
    var bienvenido = ' la neta tienes buenos gustos CONTRATADO!!!';
    var vete = ' no rifas, nosotros te llamamos';
    var numeroAudiciones = 0;
    var actores = [];
    // //la función interna tiene acceso a todos los miembros declarados con var y a los parametros
    return function (actor) {
        var str = '';
        if (numeroAudiciones > 3) {
            return 'Ya no te la chupes vete a Televisa, lo intentaste ' + numeroAudiciones + ' veces ';
        }
        if(actores.indexOf(actor)!==-1){
            return 'Ya intentaste el papel de '+actor+' y la neta no te sale';
        }
        switch (actor) {
            case 'Jim Carrey':
                str = nombre + ' ' + ' ' + bienvenido;
                break;
            case 'NIcolas Cage':
                str = nombre + ' ' + ' ' + vete;
                break;
            case 'Leonardo Dicaprio':
                str = nombre + ' ' + ' ' + bienvenido;
                break;
            default :
                str = nombre + ' ' + ' ' + vete;
                break;
        }
        actores.push(actor);
        numeroAudiciones++;
        return str;
    }
}

Comprobemos como funciona esto.

var actuando  = audicion('Oscar Arzola');
actuando('El Vitor'); //imprime: Oscar Arzola no rifas, nosotros te llamamos
actuando('Eugenio Derbez'); //imprime: Oscar Arzola no rifas, nosotros te llamamos
//Tiene memoria de que papeles han actuado
actuando('El Vitor'); //imprime: Ya intentaste el papel de El Vitor y la neta no te sale
 
//No importa el tiempo sigue teniendo memoria aunque la función audición haya terminado.
 
setTimeout(function(){
actuando('Jim Carrey'); //imprime: Oscar Arzola la neta tienes buenos gustos CONTRATADO!!!
},4000);

Seguramente los has usado cuando usas jQuery, sin embargo pocos son los que explotan realmente el potencial de los famosos “closures” (cierres), hoy hice un ejemplo basado en SuperMan 😀

Pronto pondré la explicación :)

function SuperMan(nombre) {
    //Variables disponibles en la "memoria de SuperMan"
    var JorEl = {};
    var _nombre = nombre;
    JorEl.nombre = 'JorEl - Soy tu padre';
    JorEl.frasesDeayuda = [];
    JorEl.frasesDeayuda.push('Le darás a la gente un ideal para alcanzar. Ellos te seguirán, tropezarán y caerán. Pero con el tiempo, se unirán a ti en el sol. Con el tiempo, les ayudarás a lograr maravillas.');
    JorEl.frasesDeayuda.push('¿Qué pasaría si un niño aspiraba a algo más grande?.');
    JorEl.frasesDeayuda.push('Serás diferente. A veces sentirás que no encajas. Pero nunca estarás solo.');
    JorEl.frasesDeayuda.push('Harás de mi fuerza la tuya; verás mi vida a través de tus ojos, y yo la tuya a través de los míos;');
    JorEl.frasesDeayuda.push('El hijo se convierte en padre y el padre en hijo;');
    var origen = {};
    origen.nombre = 'Kripton';
    origen.raza = 'Kriptoniano';
    return {
        deDondeSoy: function () {
            if(JorEl.nombre!==undefined)
            console.log('Eres del planeta ' + origen.nombre + ' y por lo tanto eres ' + origen.raza)
            else
                console.log('Eres del planeta ' + origen.nombre + ' y por lo tanto eres ' + origen.raza)
        },
        necesitoAyuda: function () {
            if (JorEl.nombre !== undefined) {
                var index = Math.floor((Math.random() * JorEl.frasesDeayuda.length-1) + 1);
                console.log(JorEl.frasesDeayuda[index]);
            } else {
                console.log('Piensa como un humano, y resuelvelo '+_nombre);
            }
        },
        olvidar: function () {
            JorEl.nombre = undefined;
            origen.nombre = 'Tierra';
            origen.raza = 'Humano';
        }
    }
}

¿Cómo usarlo?

var Clark = SuperMan('Khal-El');
Clark.deDondeSoy();
Clark.necesitoAyuda();
Clark.olvidar();
Clark.deDondeSoy();
Clark.necesitoAyuda();

Fish, la terminal para albañiles del web !

Hola muchas veces nos topamos con la necesidad de utilizar una terminal (consola)para hacer un poco de scripting, configurar permisos de carpetas o bien utilizar algunas cosas sabrosas y deliciosas como git, brew, composer y otras cosas que hacen que nuestra vida de desarrolladores web sea algo más rico y sustancioso.


¿Qué es Fish?

Fish viene a darle completamente un aire fresco a nuestra vieja y mugrosa terminal para hacer de ella algo más útil y divertido.

Antes existia iTerm sin embargo creo que hoy en día se requiere de herramientas más ágiles y con funcionalidad extra más allá de lo estandar.

NOTAS:

  • Fish puede ser una app o bien solo un script sh.
  • Puede causar adicción y dependencia.
  • Te envidiaran tus compas.

¿Cómo lo instalo?

Mac:

brew install fish

Linux:

http://fishshell.com

Windows: ¿En serío?

Cygwin http://fishshell.com

¿Qué cosas puedo hacer con Fish?

Scripting moderno

¿Puedo instalarlo en mi servidor remoto?

Por línea de comandos