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";