Vyhledávání na webu

Javascript s new nebo bez


Mám následující funkci

var myInstance =  (function() {
  var privateVar = 'Test';

  function privateMethod () {
    // ...
  }

  return { // public interface
    publicMethod1: function () {
      // all private members are accesible here
        alert(privateVar);
    },
    publicMethod2: function () {
    }
  };
})();

Jaký je rozdíl, pokud přidám nové do funkce. Z Firebugu se zdá, že oba objekty jsou stejné. A jak chápu, oba by měly vynucovat singleton vzor.

var myInstance =  new (function() {
  var privateVar = 'Test';

  function privateMethod () {
    // ...
  }

  return { // public interface
    publicMethod1: function () {
      // all private members are accesible here
        alert(privateVar);
    },
    publicMethod2: function () {
    }
  };
})();

Odpověď č. 1

I když se konečný výsledek zdá být totožný, cesta, jak se tam dostal, a to, co bylo vykonáno, je odlišné.

První verze spustí anonymní funkci s tím, že this je v kontextu objektu window. Druhá verze spustí anonymní funkci, ale this je v kontextu nového prázdného objektu.

Nakonec oba vrací jiný objekt (váš Singleton). Je to jen malý rozdíl v kontextu vykonávání.

Pro otestování toho vložte alert(this); těsně před deklaraci proměnné privateVar.

@Tom Squires: To nutně není pravda a je to špatná praxe nedefinovat své proměnné. Skript s direktivou "use strict"; skutečně způsobí, že JS engine bude hlásit chyby (za předpokladu, že engine podporuje "use strict";