Nel caso particolare che mostri, non c'è differenza significativa, in termini di funzionalità o visibilità.
È probabile che il programmatore originale abbia adottato questo approccio come una sorta di modello che gli consente di definire variabili private che potrebbero essere utilizzate nella definizione di cose come myFunction
:
var MyObject = {};
(function(root) {
var seconds_per_day = 24 * 60 * 60;
root.myFunction = function(foo) {
return seconds_per_day;
};
})(MyObject);
Ciò evita di calcolare seconds_per_day
ogni volta che la funzione viene chiamata, pur impedendo che inquini l'ambito globale.
Tuttavia, non c'è niente di essenzialmente diverso da quello e basta dire
var MyObject = function() {
var seconds_per_day = 24 * 60 * 60;
return {
myFunction: function(foo) {
return seconds_per_day;
}
};
}();
Il programmatore originale potrebbe aver preferito essere in grado di aggiungere funzioni all'oggetto usando la sintassi dichiarativa di root.myFunction = function
, piuttosto che la sintassi oggetto / proprietà di myFunction: function
. Ma questa differenza è principalmente una questione di preferenza.
Tuttavia, la struttura adottata dal programmatore originale ha il vantaggio che proprietà / metodi possono essere facilmente aggiunti altrove nel codice:
var MyObject = {};
(function(root) {
var seconds_per_day = 24 * 60 * 60;
root.myFunction = function(foo) {
return seconds_per_day;
};
})(MyObject);
(function(root) {
var another_private_variable = Math.pi;
root.myFunction2 = function(bar) { };
})(MyObject);
In conclusione, non è necessario adottare questo approccio se non è necessario, ma non è nemmeno necessario modificarlo, poiché funziona perfettamente e presenta alcuni vantaggi.