Nodejs module.exports和Shorthand if / else

时间:2014-02-04 02:42:36

标签: javascript node.js npm

以下代码段中的行'undefined' != typeof Customer ? Customer : module.exports有什么作用?为什么要在(function(){})内包装所有内容?我似乎无法破译其含义

此代码段来自库文件。

(function (Customer) {

  Customer.Base = {
    //...
  }

})(
  'undefined' != typeof Customer ? Customer : module.exports

);

1 个答案:

答案 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,可以是})(){()),后者是更典型的语法。