这个设计叫做什么?

时间:2014-01-22 03:25:20

标签: javascript object

我经常看到这种模式:

var suchAndSuch = new (function() {
    this.thing = "something";
    this.whoaLookAtThat = function() {
        return 4;
    }
    return {
        'thing' : thing,
        'whoaLookAtThat' : whoaLookAtThat
    }
})();

这里发生了什么?它是return声明部分,让我感到困惑。

我只是没有特别使用IIFE。

如果不出意外,知道它叫什么会帮助我研究它。

3 个答案:

答案 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没有任何意义,因为thiswindow对象。否则,如果您使用newthis会立即生成GC,因此它仍然无意义。