在您显示的特定情况下,在功能或可见性方面没有有意义的区别。
原始的编码人员很可能采用这种方法作为一种模板,从而允许他定义可用于定义诸如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);
最重要的是,如果不需要,则无需采用此方法,但也无需更改它,因为它可以很好地运行并且实际上具有一些优势。