Dans le cas particulier que vous montrez, il n'y a pas de différence significative, en termes de fonctionnalité ou de visibilité.
Il est probable que le codeur d'origine ait adopté cette approche comme une sorte de modèle lui permettant de définir des variables privées qui pourraient être utilisées dans la définition de choses comme myFunction
:
var MyObject = {};
(function(root) {
var seconds_per_day = 24 * 60 * 60; // <-- private variable
root.myFunction = function(foo) {
return seconds_per_day;
};
})(MyObject);
Cela évite de calculer à seconds_per_day
chaque appel de la fonction, tout en l'empêchant de polluer la portée globale.
Cependant, il n'y a rien de fondamentalement différent de cela et de dire simplement
var MyObject = function() {
var seconds_per_day = 24 * 60 * 60;
return {
myFunction: function(foo) {
return seconds_per_day;
}
};
}();
Le codeur d'origine a peut-être préféré pouvoir ajouter des fonctions à l'objet en utilisant la syntaxe déclarative de root.myFunction = function
plutôt que la syntaxe objet / propriété de myFunction: function
. Mais cette différence est principalement une question de préférence.
Cependant, la structure prise par le codeur d'origine a l'avantage que les propriétés / méthodes peuvent être facilement ajoutées ailleurs dans le code:
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);
En fin de compte, il n'est pas nécessaire d'adopter cette approche si vous n'en avez pas besoin, mais il n'est pas non plus nécessaire de la changer, car elle fonctionne parfaitement bien et présente en fait certains avantages.