W konkretnym przypadku, który pokazujesz, nie ma znaczącej różnicy pod względem funkcjonalności lub widoczności.
Jest prawdopodobne, że oryginalny programista przyjął to podejście jako rodzaj szablonu pozwalającego mu zdefiniować prywatne zmienne, które mogą być użyte w definicji rzeczy takich jak myFunction
:
var MyObject = {};
(function(root) {
var seconds_per_day = 24 * 60 * 60;
root.myFunction = function(foo) {
return seconds_per_day;
};
})(MyObject);
Pozwala to uniknąć obliczeń za seconds_per_day
każdym razem, gdy wywoływana jest funkcja, jednocześnie chroniąc ją przed zanieczyszczeniem zakresu globalnego.
Jednak nic zasadniczo nie różni się od tego i po prostu mówimy
var MyObject = function() {
var seconds_per_day = 24 * 60 * 60;
return {
myFunction: function(foo) {
return seconds_per_day;
}
};
}();
Oryginalny koder mógł preferować możliwość dodawania funkcji do obiektu przy użyciu deklaratywnej składni programu root.myFunction = function
, zamiast składni obiektu / właściwości myFunction: function
. Ale ta różnica jest głównie kwestią preferencji.
Jednak struktura przyjęta przez oryginalnego kodera ma tę zaletę, że właściwości / metody można łatwo dodać w innym miejscu kodu:
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);
Podsumowując, nie ma potrzeby przyjmowania tego podejścia, jeśli nie jest to konieczne, ale nie ma też potrzeby, aby go zmieniać, ponieważ działa ono doskonale i faktycznie ma pewne zalety.