No caso particular que você mostra, não há diferença significativa, em termos de funcionalidade ou visibilidade.
É provável que o codificador original tenha adotado essa abordagem como uma espécie de modelo, permitindo-lhe definir variáveis privadas que poderiam ser usadas na definição de coisas como myFunction
:
var MyObject = {};
(function(root) {
var seconds_per_day = 24 * 60 * 60; // <-- private variable
root.myFunction = function(foo) {
return seconds_per_day;
};
})(MyObject);
Isso evita calcular seconds_per_day
cada vez que a função é chamada, ao mesmo tempo que evita que ela polua o escopo global.
No entanto, não há nada essencialmente diferente disso e apenas dizer
var MyObject = function() {
var seconds_per_day = 24 * 60 * 60;
return {
myFunction: function(foo) {
return seconds_per_day;
}
};
}();
O codificador original pode ter preferido ser capaz de adicionar funções ao objeto usando a sintaxe declarativa de root.myFunction = function
, em vez da sintaxe de objeto / propriedade de myFunction: function
. Mas essa diferença é principalmente uma questão de preferência.
No entanto, a estrutura obtida pelo codificador original tem a vantagem de que as propriedades / métodos podem ser facilmente adicionados em outro lugar no 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);
Resumindo, não há necessidade de adotar essa abordagem se não for necessário, mas também não há necessidade de alterá-la, uma vez que funciona perfeitamente bem e, na verdade, tem algumas vantagens.