Ich habe von verschiedenen Orten gehört, dass globale Variablen von Natur aus böse und böse sind, aber wenn ich nicht objektorientiertes Javascript mache, kann ich nicht sehen, wie ich sie vermeiden kann. Angenommen, ich habe eine Funktion, die eine Zahl mithilfe eines komplexen Algorithmus unter Verwendung von Zufallszahlen und Ähnlichem generiert, aber ich muss diese bestimmte Zahl weiterhin in einer anderen Funktion verwenden, die ein Rückruf oder etwas anderes ist und daher nicht Teil derselben Funktion sein kann.
Wenn die ursprünglich generierte Nummer eine lokale Variable ist, kann von dort aus nicht darauf zugegriffen werden. Wenn die Funktionen Objektmethoden wären, könnte ich die Zahl zu einer Eigenschaft machen, aber das ist nicht der Fall, und es scheint etwas zu kompliziert, die gesamte Programmstruktur zu ändern, um dies zu tun. Ist eine globale Variable wirklich so schlecht?
quelle
Antworten:
Um eine in Funktion A berechnete Variable in Funktion B sichtbar zu machen, haben Sie drei Möglichkeiten:
Wenn Ihr Programm ziemlich klein ist, sind Globals nicht so schlecht. Andernfalls würde ich die dritte Methode in Betracht ziehen:
function A() { var rand_num = calculate_random_number(); B(rand_num); } function B(r) { use_rand_num(r); }
quelle
Ich denke, Ihre beste Wahl hier ist es, eine einzelne Variable mit globalem Gültigkeitsbereich zu definieren und Ihre Variablen dort abzulegen:
var MyApp = {}; // Globally scoped object function foo(){ MyApp.color = 'green'; } function bar(){ alert(MyApp.color); // Alerts 'green' }
Niemand sollte dich anschreien, weil du so etwas getan hast.
quelle
MyApp.something.color.somethingElse
var()
sollte geändert werden inbar()
, dieser winzige Syntaxfehler könnte jemandem in der Zukunft Kopfschmerzen bereiten.MyApp.color
soll erstellt und bevölkert werden, wennfoo()
es nie aufgerufen wird?Erwägen Sie die Verwendung von Namespaces:
(function() { var local_var = 'foo'; global_var = 'bar'; // this.global_var and window.global_var also work function local_function() {} global_function = function() {}; })();
Beide
local_function
undglobal_function
haben Zugriff auf alle lokalen und globalen Variablen.Bearbeiten : Ein weiteres gängiges Muster:
var ns = (function() { // local stuff function foo() {} function bar() {} function baz() {} // this one stays invisible // stuff visible in namespace object return { foo : foo, bar : bar }; })();
Auf die
return
ed-Eigenschaften kann jetzt über das Namespace-Objekt zugegriffen werden, z. B.ns.foo
unter Beibehaltung des Zugriffs auf lokale Definitionen.quelle
Was Sie suchen, ist technisch als Currying bekannt.
function getMyCallback(randomValue) { return function(otherParam) { return randomValue * otherParam //or whatever it is you are doing. } } var myCallback = getMyCallBack(getRand()) alert(myCallBack(1)); alert(myCallBack(2));
Das Obige ist nicht gerade eine Curry-Funktion, aber es erzielt das Ergebnis, einen vorhandenen Wert beizubehalten, ohne Variablen zum globalen Namespace hinzuzufügen oder ein anderes Objekt-Repository dafür zu benötigen.
quelle
myCallback
ein Verweis auf die Funktion ist,getMyCallback
die mit demrandomValue
bereits eingestellten zurückkehrt. Die Verwendung vongetRand
ist auch lehrreich, da ich sehe, dass ein mehrfachermyCallBack(1)
Aufruf denselben WertmyCallback
zurückgibt, also dem entspricht, von dem zurückgegeben wird,getMyCallBack(getRand())
und nicht nur ein Verweis auf die Funktion selbst ist. Es hat geholfen, es nur lautIch fand dies in Bezug auf die ursprüngliche Frage äußerst hilfreich:
Geben Sie den Wert zurück, den Sie in functionOne verwenden möchten, rufen Sie functionOne in functionTwo auf, platzieren Sie das Ergebnis in einer neuen Variablen und verweisen Sie auf diese neue Variable in functionTwo. Dies sollte es Ihnen ermöglichen, die in functionOne deklarierte Variable in functionTwo zu verwenden.
function functionOne() { var variableThree = 3; return variableThree; } function functionTwo() { var variableOne = 1; var var3 = functionOne(); var result = var3 - variableOne; console.log(variableOne); console.log(var3); console.log('functional result: ' + result); } functionTwo();
quelle
Wenn eine andere Funktion eine Variable verwenden muss, übergeben Sie sie als Argument an die Funktion.
Auch globale Variablen sind nicht von Natur aus böse und böse. Solange sie richtig verwendet werden, gibt es kein Problem mit ihnen.
quelle
Wenn die Möglichkeit besteht, dass Sie diesen Code wiederverwenden, würde ich mich wahrscheinlich bemühen, eine objektorientierte Perspektive zu wählen. Die Verwendung des globalen Namespace kann gefährlich sein - Sie laufen Gefahr, aufgrund von Variablennamen, die wiederverwendet werden, schwer zu findende Fehler zu finden. Normalerweise verwende ich zunächst einen objektorientierten Ansatz für mehr als einen einfachen Rückruf, damit ich nicht neu schreiben muss. Jedes Mal, wenn Sie eine Gruppe verwandter Funktionen in Javascript haben, ist dies meiner Meinung nach ein Kandidat für einen objektorientierten Ansatz.
quelle
Ein anderer Ansatz ist einer, den ich in einem Forumsbeitrag von Douglas Crockford ( http://bytes.com/topic/javascript/answers/512361-array-objects ) aufgegriffen habe . Hier ist es...
Douglas Crockford schrieb:
15. Juli 2006
"Wenn Sie Objekte anhand ihrer ID abrufen möchten, sollten Sie ein Objekt und kein Array verwenden. Da Funktionen auch Objekte sind, können Sie die Elemente in der Funktion selbst speichern."
function objFacility(id, name, adr, city, state, zip) { return objFacility[id] = { id: id, name: name, adr: adr, city: city, state: state, zip: zip } } objFacility('wlevine', 'Levine', '23 Skid Row', 'Springfield', 'Il', 10010);
"Das Objekt kann mit erhalten werden"
Auf die Objekteigenschaften kann jetzt von jeder anderen Funktion aus zugegriffen werden.
quelle
Ich kenne keine Einzelheiten zu Ihrem Problem, aber wenn die Funktion den Wert benötigt, kann es sich um einen Parameter handeln, der durch den Aufruf übergeben wird.
Globale Werte werden als schlecht angesehen, da der globale Status und mehrere Modifikatoren schwer zu befolgenden Code und seltsame Fehler verursachen können. Für viele Schauspieler kann das Herumspielen an etwas Chaos verursachen.
quelle
Sie können die Ausführung von Javascript-Funktionen vollständig steuern (und Variablen zwischen ihnen übergeben), indem Sie benutzerdefinierte jQuery-Ereignisse verwenden. Mir wurde gesagt, dass dies in diesen Foren nicht möglich ist, aber ich habe etwas zum Laufen gebracht, das genau das tut (sogar mit ein Ajax-Anruf).
Hier ist die Antwort (WICHTIG: Es ist nicht die überprüfte Antwort, sondern die Antwort von mir "Emile"):
So erhalten Sie eine Variable, die über mehrere Funktionen zurückgegeben wird - Javascript / jQuery
quelle