自我执行函数在条件之后传递对象

时间:2013-07-13 12:54:12

标签: javascript oop parentheses

我遇到了一个自执行函数,它在声明包含var的条件下执行,如果它不存在则传递一个对象。

示例:

var myFunc = (function(myFunc){}(myFunc || {}));

为什么有一个传递对象的“或”条件运算符?

2 个答案:

答案 0 :(得分:6)

您提供的代码是module pattern的示例。特别是它是模块模式loose augmentation的一个例子。

模块模式基本上只是一个返回对象的immediately invoked function expression (IIFE)。例如:

// file 1

var MODULE = (function () {
    var my = {}, privateVariable = 1;

    function privateMethod() {
        // ...
    }

    my.moduleProperty = 1;

    my.moduleMethod = function () {
        // ...
    };

    return my;
}());

扩充允许您将模块拆分为多个部分。每个部分都可以驻留在它自己的文件中。例如,我们可以按如下方式扩充上述模块:

// file 2

var MODULE = (function (my) {
    my.anotherMethod = function () {
        // added method...
    };

    return my;
}(MODULE));

但是,在这种扩充模式中file 1必须在file 2之前加载,否则您将收到错误。松散扩充允许您以任何顺序加载文件。

var MODULE = (function (my) {
    // add capabilities...

    return my;
}(MODULE || {}));

在上面的示例中,模块MODULE可以拆分为多个文件,可以按任何顺序加载。表达式MODULE || {}计算结果为MODULE(如果存在)。否则评估为{}

因此,对于加载的第一个文件,表达式将评估为{},因为MODULE最初为undefined。在后续文件中,表达式将计算为MODULE

答案 1 :(得分:0)

var myFunc = (function(myFunc){}(myFunc||{}));

这没有任何意义,因为myFunc Argument总是{} - 我对此感到困惑。

我会解释一个

  

第一个例子

var cool = {
   person: 'john'
};

(function( Argument ){
  console.log( Argument ); // Result Object {person: "john"} 
}( cool || {} ));

在此示例中,定义了cool并且它是一个对象,因此它不会超过||


  

下一个例子

var cool;
(function( Argument ){
  console.log( Argument ); // Result Object {}
}( cool || {} ));

在此示例中,定义了cool 变量的defualt值为undefined 所以在这种情况下它是未定义的,因此Argument是一个Object而不是