2016-11-26 1 views
0

Globale Variablen werden als schlechte Praxis angesehen, aber ich möchte sie als eine Art einfacher "Singleton" -Wert verwenden.node.js: Wie setze ich eine globale Variable aus einer anonymen Funktion?

Das folgende enthält drei verschiedene Arten der Deklaration von Variablen in einem globalen Bereich in NodeJS (glaube ich). Die Funktion change2() kann ihre Werte von "... eins" auf "... zwei" ändern. Mit der Funktion change3() ist es jedoch nicht möglich, sie auf "... drei" zu setzen.

Wie kann ich den Wert einer globalen Variablen innerhalb einer anonymen Funktion ändern? - Ich habe auch versucht, eine Setter-Methode ohne Wirkung aufzurufen. Der Aufruf von bind() ist nur eine hilflose Schätzung.

global.v1 = 'v1: one'; 
    var v2 = 'v2: one'; 
    v3 = 'v3: one'; 

    function change2() { 
     global.v1 = 'v1: two'; 
     v2 = 'v2: two'; 
     v3 = 'v3: two'; 
    }; 

    function change3() { 
     (function() { 
      global.v1 = 'v1: three'; 
      v2 = 'v2: three'; 
      v3 = 'v3: three'; 
     }).bind({v1:v1, v2:v2, v3:v3}); 
    }; 

    console.log (v1, v2, v3); 
    change2(); 
    console.log (v1, v2, v3); 
    change3(); 
    console.log (v1, v2, v3); 

Ausgabe lautet:

O:\node>node scope 
v1: one v2: one v3: one 
v1: two v2: two v3: two 
v1: two v2: two v3: two 

O:\node> 
+1

keine direkte Antwort, aber eine Datei "v1.js" mit dem Inhalt 'module.exports = {}' funktioniert sogar noch besser für ein einfaches Singleton. dann einfach 'require ('./ v1')' in deinen anderen Modulen. –

+0

In 'change3()' führen Sie niemals die interne Funktion aus. '.bind()' gibt nur eine neue Funktion zurück, die Sie aber nie aufrufen. – jfriend00

+0

Danke @ jfriend00 für die Erkennung. Das Ersetzen von '.bind (...)' mit nur '()' löste den Aufruf aus und "... three" wurde gesetzt. –

Antwort

1

In change3() Sie nie wirklich die interne Funktion auszuführen. .bind() gibt nur eine neue Funktion zurück, aber Sie rufen diese neue Funktion nie tatsächlich auf.

function change3() { 
    (function() { 
     global.v1 = 'v1: three'; 
     v2 = 'v2: three'; 
     v3 = 'v3: three'; 
    }).bind({v1:v1, v2:v2, v3:v3})(); // add parens at the end here 
}; 

Aber Sie brauchen nicht einmal die .bind() hier, da es nicht Ihnen helfen wird:

Wenn Sie es nennen wollen, dann würden Sie Pars nach dem .bind() hinzufügen.

function change3() { 
    (function() { 
     global.v1 = 'v1: three'; 
     v2 = 'v2: three'; 
     v3 = 'v3: three'; 
    })(); // add parens at the end here 
}; 
Verwandte Themen