【问题标题】:Calling functions from a parameterized module.exports从参数化的 module.exports 调用函数
【发布时间】:2020-09-20 19:00:48
【问题描述】:

引用this solution,我需要将参数传递到我的utils.js 文件的module.exports

// utils.js
var module;
module.exports = function (name) {
    if (module) return module;

    module = {};

    module.sayHi = function () {
        return `Hi, ${name}`;
    };

    return module;
};

对于在requireing utils.js 之后如何调用sayHi,我有点困惑。

// index.js
const utils = require("./utils")("Jim");    
utils.sayHi();

我收到TypeError: utils.sayHi is not a function。拨打sayHi的正确方法是什么?

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    首先创建一个名为 module 的变量。

    var module;
    

    什么都不做,因为您是在模块范围内执行此操作,因此该变量已经存在。


    然后你给module.exports分配一个函数。

    在另一个模块中,导入该函数并调用它。

    该函数的第一行说:

    if (module) return module;
    

    module 是真值吗?

    是的。它是一个对象。如果不是,那么分配给module.exports 会引发异常。

    因此,您永远不会覆盖module = {}; 或将sayHi 函数分配给它。


    现在看看你引用的答案:

    module.exports = function (app, db) {
        var module = {};
    

    它在函数范围内创建了一个变量,因此它不会与现有变量冲突。

    【讨论】:

    • var module; 超出module.exports 范围的原因是,如果多次引用,则尝试缓存模块(请参阅:stackoverflow.com/questions/13151693/…)。我可能在模块中有一个不值得多次重新计算的值。只是我目前的实现似乎行不通。
    • @slider — 正如答案所暗示的那样,您可以使用不同的变量名 ...但它会缓存您传递给name 参数的第一个名称,并且你会被它困在后续的调用中。如果您想合理缓存,则需要分别存储每个 name 的结果。
    • @slider 但是你不想缓存,如果导出的函数被不同的names调用。
    • 在这种情况下,是的,name 对于值得缓存的东西来说是一个糟糕的参数。但其他值可能确实值得缓存。
    猜你喜欢
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多