Ámbito


var makeCounter = function() {
  var privateCounter = 0;
  function changeBy(val) {
    privateCounter += val;
  }
  return {
    increment: function() {
      changeBy(1);
    },
    decrement: function() {
      changeBy(-1);
    },
    value: function() {
      return privateCounter;
    }
  }
};
//esta segunda versión lo que hace es no ejecuta la función nada más crearla sino que guarla la función en una variable.
//Con lo que al igual que pasaba antes, cuando se ejecute devolverá lo que devuelve el return, es decir crea un contador

  var counter1 = makeCounter();
  var counter2 = makeCounter();
  console.log(counter1.value()); /* Alerts 0 */
  counter1.increment();
  counter1.increment();
  console.log(counter1.value()); /* Alerts 2 */
  counter1.decrement();
  console.log(counter1.value()); /* Alerts 1 */
  console.log(counter2.value()); /* Alerts 0 */