В конкретном случае, который вы показываете, нет значимой разницы с точки зрения функциональности или видимости.
Вполне вероятно, что исходный кодировщик принял этот подход как своего рода шаблон, позволяющий ему определять частные переменные, которые можно было бы использовать в определении таких вещей, как myFunction
:
var MyObject = {};
(function(root) {
var seconds_per_day = 24 * 60 * 60;
root.myFunction = function(foo) {
return seconds_per_day;
};
})(MyObject);
Это позволяет избежать вычислений seconds_per_day
каждый раз при вызове функции, а также не допустить загрязнения глобальной области видимости.
Тем не менее, нет ничего принципиально отличного от этого и просто говорю
var MyObject = function() {
var seconds_per_day = 24 * 60 * 60;
return {
myFunction: function(foo) {
return seconds_per_day;
}
};
}();
Первоначальный кодировщик, возможно, предпочел иметь возможность добавлять функции к объекту, используя декларативный синтаксис root.myFunction = function
, а не синтаксис объекта / свойства myFunction: function
. Но это различие в основном вопрос предпочтений.
Однако структура, принятая исходным кодировщиком, имеет то преимущество, что свойства / методы могут быть легко добавлены в другом месте кода:
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);
В итоге, нет необходимости применять этот подход, если он вам не нужен, но также нет необходимости его менять, поскольку он отлично работает и на самом деле имеет некоторые преимущества.