【问题标题】:How to self-reference NodeJS Module?如何自引用 NodeJS 模块?
【发布时间】:2020-01-09 04:06:23
【问题描述】:

我有一个要导出的模块。我需要一个函数来调用另一个函数。这是我正在尝试做的简化版本。

module.exports = {
  isEven: (number) => {
    return (number%2 == 0)
  },
  isTenEven: () => {
    return isEven(10)
  }
}

上面的代码在调用moduleName.isTenEven() 时抛出isEven is not defined

为什么失败是有道理的。但是你会如何重写它呢? (同时保持单例模式)

【问题讨论】:

    标签: javascript node.js node-modules


    【解决方案1】:

    先定义函数,再导出:

    const isEven = (number) => number % 2 === 0
    const isTenEven = () => isEven(10)
    
    module.exports = {
      isEven,
      isTenEven
    }
    

    【讨论】:

      【解决方案2】:

      该对象仅用于将功能组合在一起。没有什么真正的面向对象,所以单独定义函数。最后构造对象。

      const isEven = number => number % 2 === 0;
      const isTenEven = () => isEven(10);
      module.exports = { isEven, isTenEven };
      

      【讨论】:

        【解决方案3】:

        也许只是这样做?定义然后导出。

        const isEven = number => number % 2 === 0;
        
        module.exports = {
          isEven,
          isTenEven: () => isEven(10)
        };
        

        【讨论】:

          【解决方案4】:

          只是为了在混合物中再添加一种解决方案。您不必在其他地方定义函数。由于对象声明在函数被调用之前已经完成,您可以通过module.exportsexports 引用它,如下所示:

          module.exports = exports = {
            isEven: (number) => {
              return (number%2 === 0)
            },
            isTenEven: () => {
              return exports.isEven(10)
            }
          }
          

          如果您在很多方法中都这样做,您可以为导出的对象定义一个较短的变量名并引用它。

          【讨论】:

          • arrow functions 中,如果正文中的唯一语句是return 语句,您可以去掉它周围的括号。如果箭头函数只有一个参数,您也可以删除它周围的括号。因此,例如,您的 isEven 可以这样重写:isEven: number => number % 2 === 0。应该几乎总是使用强相等 === 而不是 ==,并避免类型强制,特别是在您确定运算符两侧的数据类型的这种情况下。
          • @StephenMIrving - 是的,我知道。我只是保留了 OP 使用的格式。是否删除大括号(就像使用单个语句 if)以及是否使用 () 包围单个参数,这是个人风格选择。我坚持使用 OP 自己选择的风格。我确实将== 更改为===,因为这是这里的最佳选择(我没有注意到,因为这不是答案的重点)。
          • 是的,我知道箭头函数格式是一种样式选择,只是想让你知道,以防你不知道。 ??
          【解决方案5】:

          如果你买得起 Babel 或支持导入/导出语句的 Node.js 版本,你也可以这样做:

          export const isEven = num => num % 2 === 0;
          export const isTenEven = () => isEven(10);
          

          【讨论】:

            【解决方案6】:

            在 JS 对象字面量中使用 this 指代对象本身,因此您可以:

            module.exports = {
              isEven: (number) => {
                return (number%2 == 0)
              },
              isTenEven: function () {
                return this.isEven(10)
              }
            }
            

            【讨论】:

            • 没有。箭头函数从定义它们的词法范围继承 this。它们没有自己的 this 值。
            • 嘿艾沃。在问之前我试过了。它不起作用。
            • 是的,最初错过了,然后立即编辑。它应该可以工作。
            • 这不如其他答案提出的解决方案安全,因为函数可能与对象分离(例如const { isEven, isTenEven } = require("./someModule.js");
            • 是的。但既然问题是“如何自引用 NodeJS 模块”,它仍然是一个准确的答案。
            猜你喜欢
            • 1970-01-01
            • 2020-08-15
            • 2023-03-29
            • 1970-01-01
            • 1970-01-01
            • 2016-06-23
            • 1970-01-01
            • 2021-09-10
            • 2020-08-06
            相关资源
            最近更新 更多