我遇到了一个自执行函数,它在声明的包含 var 存在的条件下执行,如果它不存在,则传递一个对象。
例子:
var myFunc = (function(myFunc){}(myFunc || {}));
为什么会有一个传递对象的“或”条件运算符?
我遇到了一个自执行函数,它在声明的包含 var 存在的条件下执行,如果它不存在,则传递一个对象。
例子:
var myFunc = (function(myFunc){}(myFunc || {}));
为什么会有一个传递对象的“或”条件运算符?
您提供的代码是模块模式的一个示例。特别是它是模块模式松散增强的一个例子。
模块模式基本上只是一个立即调用的函数表达式(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
.
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
所以在这种情况下它是未定义的所以参数是一个对象