En el caso particular que muestra, no hay una diferencia significativa, en términos de funcionalidad o visibilidad.
Es probable que el codificador original adoptó este enfoque como una especie de plantilla que le permite definir variables privadas que podrían usarse en la definición de cosas como myFunction
:
var MyObject = {};
(function(root) {
var seconds_per_day = 24 * 60 * 60;
root.myFunction = function(foo) {
return seconds_per_day;
};
})(MyObject);
Esto evita calcular seconds_per_day
cada vez que se llama a la función, al mismo tiempo que evita que contamine el alcance global.
Sin embargo, no hay nada esencialmente diferente de eso y solo decir
var MyObject = function() {
var seconds_per_day = 24 * 60 * 60;
return {
myFunction: function(foo) {
return seconds_per_day;
}
};
}();
El codificador original puede haber preferido poder agregar funciones al objeto usando la sintaxis declarativa de root.myFunction = function
, en lugar de la sintaxis de objeto / propiedad de myFunction: function
. Pero esa diferencia es principalmente una cuestión de preferencia.
Sin embargo, la estructura adoptada por el codificador original tiene la ventaja de que las propiedades / métodos se pueden agregar fácilmente en otra parte del código:
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 resumen, no es necesario adoptar este enfoque si no es necesario, pero tampoco es necesario cambiarlo, ya que funciona perfectamente bien y en realidad tiene algunas ventajas.