У конкретному випадку, який ви показуєте, немає суттєвої різниці з точки зору функціональності та видимості.
Цілком ймовірно, що оригінальний кодер прийняв цей підхід як свого роду шаблон, що дозволяє йому визначати приватні змінні, які можуть бути використані у визначенні таких речей, як 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);
Підсумок: немає необхідності застосовувати цей підхід, якщо вам це не потрібно, але також не потрібно його змінювати, оскільки він чудово працює і насправді має деякі переваги.