【问题标题】:Nodejs module.exports and Shorthand if/elseNodejs module.exports 和速记 if/else
【发布时间】:2014-02-04 13:35:04
【问题描述】:

下面代码 sn-p 中的'undefined' != typeof Customer ? Customer : module.exports 行是做什么的?为什么你把所有的东西都包装在(function(){}) 中?我似乎无法破译它的含义

这个 sn-p 来自一个库文件。

(function (Customer) {

  Customer.Base = {
    //...
  }

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

);

【问题讨论】:

    标签: javascript node.js npm


    【解决方案1】:

    这是一个三元组,用于确定传递给函数的内容。该函数是一个立即调用函数表达式 (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,可以是 })(){()),后者是更典型的语法。

    【讨论】:

      猜你喜欢
      • 2014-08-08
      • 2013-07-18
      • 2016-10-06
      • 1970-01-01
      • 2011-07-17
      • 2016-12-26
      • 2016-05-15
      • 2014-09-07
      • 2013-04-08
      相关资源
      最近更新 更多