2017-01-14 5 views
0

Ich habe ein Modul, in dem ich einer öffentlichen Variablen eine Funktion zuweisen und dann die Funktion innerhalb dieses Moduls verwenden möchte. Sehen Sie das Beispiel unten für was ich dachte, dass ich in der Lage wäre zu tun.Weisen Sie Funktionen zwischen Modulen zu

main.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(); 
}()); 

test.js

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

    function callSomeFunction() { 
     someFunction(); 
    } 

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

Um diese Arbeit zu machen, ich habe derzeit eine Methode, um die Funktion in dem Modul zu setzen, schauen test.js würde so wie der Ausschnitt unten.

test.js

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

    function callSomeFunction() { 
     someFunction(); 
    } 

    function setSomeFunction(newFunction) { 
     someFunction = newFunction; 
    } 

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

Da ich nicht das Gefühl, dass dies eine sehr elegante Lösung ist, habe ich mich gefragt, ob es eine Alternative war, vielleicht eine Möglichkeit, die ersten beiden Schnipsel an der Arbeit wie beabsichtigt, oder wenn ich mit der Setter-Methode festhalte.

Antwort

0
function callSomeFunction() { 
    someFunction(); 
} 

callSomeFunction ist als someFunction zeitlich früher definiert (als hoisting bekannt).

in der folgenden Definition Reihenfolge Resultierende:

1. callSomeFunction 
2. someFunction 

Entweder sollten diese Funktion ändern, um von einem const oder let gespeichert werden, wie Sie mit someFunction tat oder sie beide als function haben.

+0

Wenn ich etwas nicht vermisse, funktioniert Ihre Lösung leider nicht. Selbst wenn beide Funktionen entweder mit "let" oder "function" definiert werden, tritt das gleiche Verhalten auf, wo die alte Funktion aufgerufen wird. – tobloef

Verwandte Themen