这是一个三元组,用于确定传递给函数的内容。该函数是一个立即调用函数表达式 (IIFE) - 一个被创建并立即调用的函数。
//the condition
'undefined' != typeof Customer
//true value
? Customer
//false value
: module.exports
如果Customer 未定义,则结果相同:
(function (Customer) {
Customer.Base = {
//...
}
})(module.exports);
所以这个代码块正在创建并立即调用一个对Customer 执行某些操作的函数。如果定义了Customer,则Customer 将作为函数参数传递给函数,该参数也称为Customer。如果Customer 未定义,则module.exports 作为Customer 参数传递给函数。这段代码可以改写为:
var param;
if ('undefined' != typeof Customer) {
param = Customer;
} else {
param = module.exports;
}
function myFunc(Customer) {
Customer.Base = {
//...
}
}
myFunc(param);
用一个更通用的例子可能更容易理解。
这是一个 IIFE,一个创建并立即调用的函数:Live demo (click).
(function(param) {
console.log(param);
})('some param!');
这是相同的函数,使用三进制来确定参数值:Live demo (click).
var x = true;
//var x = false;
var value = x ? 'true value!' : 'false value!';
(function(param) {
console.log(param);
})(value);
将x(条件)更改为真或假,并查看value 的赋值是否相应更改。
您可能经常会看到 () 中包含的三元条件,但它们不是必需的:
('undefined' != typeof Customer) ? Customer : module.exports
此外,更典型的情况是看到该语句以相反的方式提出:
typeof Customer === 'undefined'
很可能在这里对“真实性”进行简单的松散相等性检查就足够了:
Customer ? Customer : module.exports
这又可以简化为:
Customer || module.exports
//if "Customer" is truthy, it will be used, otherwise, module.exports is used
另请注意,对于 IIFE,可以是 })() 或 {()),后者是更典型的语法。