2

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

例子:

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

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

4

2 回答 2

6

您提供的代码是模块模式的一个示例。特别是它是模块模式松散增强的一个例子。

模块模式基本上只是一个立即调用的函数表达式(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.

于 2013-07-13T14:46:27.667 回答
0
var myFunc = (function(myFunc){}(myFunc||{}));

这没有任何意义,因为 myFunc 参数将永远是{}- 我对此感到困惑。

生病解释一个

第一个例子

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 || {} ));

在这个例子中酷被定义但是变量的默认值是undefined 所以在这种情况下它是未定义的所以参数是一个对象

于 2013-07-13T13:12:07.057 回答