我最近遇到了以下模式:
/* PATTERN 1 */
(function(window) {
var Stuff = (function() { // Variable assignment and self-invoking anonymous function
function Stuff(params) {
this.items = [];
}
Stuff.prototype = {
someMethod1: function() {
},
someMethod2: function() {
}
};
return Stuff;
}()); // END Variable assignment
Stuff.create = function(params) {
return new Stuff(params);
};
window.Stuff = Stuff;
}(window));
让我感到困惑的是分配Stuff
变量的角色。具体来说,这种模式如何在操作上与以下不同:
/* PATTERN 2 */
(function(window) {
// No variable assignment or self-invoking anonymous function
function Stuff(params) {
this.items = [];
}
Stuff.prototype = {
someMethod1: function() {
},
someMethod2: function() {
}
};
Stuff.create = function(params) {
return new Stuff(params);
};
window.Stuff = Stuff;
}(window));
模式1的原型方法的范围是否以某种方式私有,模式2的原型方法不是? 这纯粹是一种风格化的方法,可以更明确地分离业务逻辑吗?
答案 0 :(得分:2)
完全没有区别。内部IIFE is totally pointless,因为它没有任何局部变量,可以安全地省略。唯一(小)差异是外部IIFE中的Stuff
现在是function declaration, not a function assigned to a variable。
当然,就目前情况而言,外部IEFE也是无用的,除了代码组织。
答案 1 :(得分:2)
这两种模式都允许您轻松创建附加到Stuff"类"的真正私有变量,但不能在其外部访问:
var Stuff = (function() { // Variable assignment and self-invoking anonymous function
var stuff_private = "stuff";
function Stuff(params) {
this.items = [];
}
Stuff.prototype = {
someMethod1: function() {
},
someMethod2: function() {
}
getStuff: function() {
return stuff_private;
}
};
return Stuff;
}()); // END Variable assignment
stuff_private
现已嵌入Stuff的范围内,但它对外界来说是不可见的。您也可以在第二个模式中执行此操作,但如果您在同一个文件中创建多个类,每个类都有自己的私有变量,那么第一个模式可能有意义。