我经常看到这种模式:
var suchAndSuch = new (function() {
this.thing = "something";
this.whoaLookAtThat = function() {
return 4;
}
return {
'thing' : thing,
'whoaLookAtThat' : whoaLookAtThat
}
})();
这里发生了什么?它是return
声明部分,让我感到困惑。
我只是没有特别使用IIFE。
如果不出意外,知道它叫什么会帮助我研究它。
答案 0 :(得分:5)
这是一个立即执行的函数和一个(混乱的位)闭包的组合。我认为你的例子可能有点瑕疵,如果是这样可能会更好:
var suchAndSuch = (function() {
var thing = "something";
function setThing(newThing){
//maybe do some error checking here
thing = newThing;
};
function getThing(){
return thing;
};
return {
getThing : getThing,
setThing : setThing
}
})();
然后你会有一个函数执行立即返回一个新对象,有效地提供一个私有变量和一个访问器函数。我已多次使用这样的结构。
答案 1 :(得分:1)
这是尝试在JavaScript中使用公共/私有变量...我相信它被称为模块化模式。
var suchAndSuch = (function() {
var privateVariable = "something";
var privateFunction = function() {
return 4;
}
return {
publicMethod1: function() {
return privateVariable;
},
publicMethod2: function() {
return privateFunction();
}
}
})();
基本上,在IIFE内宣布的任何变量都是私有的。然后返回一个带方法的对象。由于对象/方法在与私有变量相同的范围内定义,因此方法仍然可以访问它们。但是,没有别的了。
答案 2 :(得分:1)
它被称为自我调用的lambda。 JS具有函数范围,因此为了礼貌地保存全局命名空间,您必须使用函数。为了使其立即执行,就像它是具有块作用域的顶级代码一样,将其包装在(bla)()
中 - 因此自我调用。当它实际返回一个带有其作用域的某个子集作为属性的对象时,它通常被赋值给一个变量,并被称为模块模式。
返回与new
创建的对象不同的对象的做法是我有时认为保护忘记new
并只调用构造函数的代码的方法。但是,在该上下文中,将属性分配给this
没有任何意义,因为this
是window
对象。否则,如果您使用new
,this
会立即生成GC,因此它仍然无意义。