Dalam kasus tertentu yang Anda tunjukkan, tidak ada perbedaan yang berarti, dalam hal fungsionalitas atau visibilitas.
Sepertinya pembuat kode asli mengadopsi pendekatan ini sebagai semacam templat yang memungkinkannya untuk menentukan variabel privat yang dapat digunakan dalam definisi hal-hal seperti myFunction
:
var MyObject = {};
(function(root) {
var seconds_per_day = 24 * 60 * 60;
root.myFunction = function(foo) {
return seconds_per_day;
};
})(MyObject);
Ini menghindari penghitungan seconds_per_day
setiap kali fungsi dipanggil, sekaligus menjaganya agar tidak mencemari ruang lingkup global.
Namun, pada dasarnya tidak ada yang berbeda dari itu dan hanya mengatakan
var MyObject = function() {
var seconds_per_day = 24 * 60 * 60;
return {
myFunction: function(foo) {
return seconds_per_day;
}
};
}();
Pembuat kode asli mungkin lebih suka untuk dapat menambahkan fungsi ke objek menggunakan sintaks deklaratif root.myFunction = function
, daripada sintaks objek / properti myFunction: function
. Tetapi perbedaan itu terutama adalah masalah preferensi.
Namun, struktur yang diambil oleh pembuat kode asli memiliki keuntungan bahwa properti / metode dapat dengan mudah ditambahkan di tempat lain dalam kode:
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);
Intinya, tidak perlu mengadopsi pendekatan ini jika Anda tidak perlu, tetapi juga tidak perlu mengubahnya, karena ini bekerja dengan baik dan sebenarnya memiliki beberapa keuntungan.