Cierres "Closures"

En JavaScript el cuerpo o bloques de funciones pueden tener acceso a variables definidas fuera de ellas. Esto es posible por parte del proceso de ambiente lexico.

let name = 'John Petes';
function greeting() {
  console.log('Hello ' + name + '!');
}

greeting(); //-> Hello John Petes!

Cierres "Closures" es la combinacion de funcion y su ambiente lexico en donde la misma funcion fue definida o declarada. El poder del cierres "closures" es su capacidad de que funciones internas pueden tener acceso a funciones externas, variables y parametros.

function greeting() {
  let name = 'John Petes';
  function displayName() {
    console.log('Hello ' + name + '!');
  }
  displayName();
}

greeting(); //-> Hello John Petes!
function greeting() {
  let name = 'John Petes';
  function displayName() {
    console.log('Hello ' + name + '!');
  }
  function setName (newName) {
    name = newName;
  }
  displayName();
  setName('John Pierr');
  displayName();
}

greeting(); //-> Hello John Petes! Hello John Pierr!

Cierres nos permite no solo leer variables externa, si no tambien manipularlas.

Uno de los patrones mas comunes de utilizar cierres "closures", es para desarrollar "factories" de funciones.

function job(title) {
  return function(prefix) {
    return prefix + ' ' + title;
  }
}

const designer = job('Designer');
const developer = job('Programmer');

console.log(designer('Senior')); //-> Senior Designer
console.log(developer('JavaScript')); //-> JavaScript Programmer

Patrones Modulos "Module Patterns"

Patrones de modulo es una de las habilidades de JavaScript, que nos permite de alguna manera desarrollar metodos privados y variables privadas al combinar cierres "closures" y IIFE

  • Classico
const foo = (function(){
  let obj = { bar: 'bar'};
  return {
    bar: function() {
      console.log(obj.bar);
    }
  };
})();

foo.bar(); //-> "bar"
  • Modified
const foo = (function(){
  let publicAPI = {
    bar: function(){
      publicAPI.baz();
    },
    baz: function(){
      console.log("baz");
    }
  };
  return publicAPI;
})();

foo.bar(); //-> baz

results matching ""

    No results matching ""