我遇到了一个自执行函数,它在声明包含var的条件下执行,如果它不存在则传递一个对象。
示例:
var myFunc = (function(myFunc){}(myFunc || {}));
为什么有一个传递对象的“或”条件运算符?
答案 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而不是