Назначение функций между модулями

У меня есть модуль, где я хочу назначить функцию публичной переменной, а затем использовать функцию внутри этого модуля. Ниже приведен пример того, что, по моему мнению, я мог бы сделать.

главный.js

;(function() {
    const test = require("./test");

    function newFunction() {
        console.log("New function");
    }

    // This works fine
    test.someFunction = newFunction;
    test.someFunction();

    // But this doesn't
    test.callSomeFunction();
}());

тест.js

;(function() {
    let someFunction = function() {
        console.log("Old function");
    }

    function callSomeFunction() {
        someFunction();
    }

    module.exports = {
        someFunction,
        callSomeFunction
    }
}());

Чтобы сделать эту работу, у меня в настоящее время есть метод, чтобы установить функцию в модуле, так test.jsчто будет выглядеть как фрагмент ниже.

тест.js

;(function() {
    let someFunction = function() {
        console.log("Old function");
    }

    function callSomeFunction() {
        someFunction();
    }

    function setSomeFunction(newFunction) {
        someFunction = newFunction;
    }

    module.exports = {
        setSomeFunction,
        callSomeFunction
    }
}());

Поскольку я не чувствую, что это очень элегантное решение, мне было интересно, есть ли альтернатива, возможно, какой-то способ заставить первые два фрагмента работать так, как задумано, или если я застрял с методом setter.

1 ответ

  1. function callSomeFunction() {
        someFunction();
    }
    

    callSomeFunction определяется раньше по времени, чем someFunction(известный как подъем).

    В результате получается следующий порядок определения:

    1. callSomeFunction
    2. someFunction
    

    Вы должны либо изменить эту функцию, чтобы она была сохранена a constили letкак вы сделали с someFunctionними, либо иметь их оба как function.