以下代码段中的行'undefined' != typeof Customer ? Customer : module.exports
有什么作用?为什么要在(function(){})
内包装所有内容?我似乎无法破译其含义
此代码段来自库文件。
(function (Customer) {
Customer.Base = {
//...
}
})(
'undefined' != typeof Customer ? Customer : module.exports
);
答案 0 :(得分:1)
这是三元组,用于确定传递给函数的内容。该函数是一个立即调用的函数exppression(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
(条件)更改为true或false,并看到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,可以是})()
或{())
,后者是更典型的语法。