2017-10-21 8 views
0

Ich habe die folgende Funktion in meiner counter.js Datei:die Nummer Inkrementieren funktioniert nicht in NodeJS

//counter.js 
var counter = 1; 

function increment() { 
    counter++; 
} 

function decrement() { 
    counter--; 
} 

function getCounter() { 
    return counter; 
} 

module.exports = { 
    counter: counter, 
    increment: increment, 
    decrement: decrement, 
    getCounter: getCounter 
}; 

In meinem main.js ich den folgenden Code haben:

//main.js 
var counter = require('./counter'); 
counter.increment(); 
console.log(counter.counter); // 1 
console.log(counter.getCounter()); // 2 

I zu verstehen, ist nicht in der Lage, warum hat die

counter.counter

gibt 1 als Ausgang, während der

counter.getCounter()

2 als das Ausgangssignal ergibt.
Was ist die mögliche Erklärung für dieses Verhalten?

Antwort

2

Was ist die mögliche Erklärung für dieses Verhalten?

JavaScript ist Bestanden/Anruf/assign von Wert (und nein, Leute, die Objekte Anspruch weitergegeben werden von Referenz are wrong). Das heißt, wenn Sie

taten
module.exports = { 
    counter: counter, 
    ... 
}; 

ein Kopie des aktuellen Wertes des counter Variable (das heißt der Wert counter hat im Moment, dass Zeile ausgeführt wird) an die counter Eigenschaft zugeordnet ist. Die Änderung des Werts der Variablencounter hat keine Auswirkung auf die Eigenschaftcounter.

Hier ist ein einfacheres Beispiel für die Situation:

var foo = 42; 
 
var bar = foo; 
 
foo = 21; 
 
console.log(bar); // still 42, not 21


getCounter() auf der anderen Seite liest den Wert der Variablen counter jedes Mal, sie genannt wird, so wird es gib immer den aktuellen Wert der Variablen zurück.

+0

Einverstanden natürlich.Beachten Sie, dass ein möglicher Punkt der Verwirrung des OP wohl annehmen kann, dass das "Modul" im Kontext eines "Objekts" steht: [Ist JavaScript eine Pass-by-Reference oder Pass-by-Value-Sprache?] (Https://stackoverflow.com/a/3638034/2313887). Was natürlich ein "Modul" nicht ist. –

0

Felix, natürlich, oben hat eine gute Erklärung, warum dies so funktioniert, wie es tut. Eine schöne Lösung für das Problem (wenn Sie nicht alt js unterstützen müssen) ist ein getter auf Export zuzuordnen:

module.exports = { 
    get counter() { return counter }, 
    increment: increment, 
    decrement: decrement, 
}; 

Wenn Sie jetzt counter.counter in Ihrem anderen Skript zugreifen werden Sie wirklich ein anrufen Funktion, die den Wert counter von Ihrem Modul abgreift.