Trong trường hợp cụ thể mà bạn hiển thị, không có sự khác biệt có ý nghĩa, về chức năng hoặc khả năng hiển thị.
Có khả năng là lập trình viên ban đầu đã áp dụng cách tiếp cận này như một loại khuôn mẫu cho phép anh ta xác định các biến riêng có thể được sử dụng trong định nghĩa của những thứ như myFunction
:
var MyObject = {};
(function(root) {
var seconds_per_day = 24 * 60 * 60;
root.myFunction = function(foo) {
return seconds_per_day;
};
})(MyObject);
Điều này giúp tránh tính toán seconds_per_day
mỗi khi hàm được gọi, đồng thời giữ cho nó không làm ô nhiễm phạm vi toàn cầu.
Tuy nhiên, về cơ bản không có gì khác với điều đó và chỉ nói
var MyObject = function() {
var seconds_per_day = 24 * 60 * 60;
return {
myFunction: function(foo) {
return seconds_per_day;
}
};
}();
Người lập trình ban đầu có thể thích có thể thêm các chức năng vào đối tượng bằng cách sử dụng cú pháp khai báo của root.myFunction = function
, hơn là cú pháp đối tượng / thuộc tính của myFunction: function
. Nhưng sự khác biệt đó chủ yếu là vấn đề sở thích.
Tuy nhiên, cấu trúc được sử dụng bởi người viết mã gốc có lợi thế là các thuộc tính / phương thức có thể dễ dàng được thêm vào các nơi khác trong mã:
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);
Tóm lại, không cần áp dụng cách tiếp cận này nếu bạn không cần thiết, nhưng cũng không cần phải thay đổi nó, vì nó hoạt động hoàn toàn tốt và thực sự có một số ưu điểm.