Frage

Ich habe von einer Vielzahl von Orten gehört, die globale Variablen von Natur aus böse und böse sind, aber wenn einige nicht-objektorientierte Javascript tun, kann ich nicht sehen, wie sie zu vermeiden. Sagen, dass ich eine Funktion habe, die eine Zahl mit einem komplexen Algorithmus unter Verwendung von Zufallszahlen und Sachen, aber ich brauche zu halten mit, dass bestimmte Zahl in einer anderen Funktion, die ein Rückruf oder etwas ist, erzeugt und kann daher nicht Teil der gleichen Funktion.

Wenn die ursprünglich generierte Nummer eine lokale Variable ist, wird es nicht aus, es zugänglich sein. Wenn die Funktionen Objektmethoden waren, konnte ich die Zahl eine Eigenschaft machen, aber sie sind nicht und es scheint etwas kompliziert die gesamte Programmstruktur zu ändern, dies zu tun. Ist eine globale Variable wirklich so schlecht?

War es hilfreich?

Lösung

Um eine Variable in der Funktion A sichtbar in Funktion B berechnet zu machen, haben Sie drei Möglichkeiten:

  • machen es zu einem globalen,
  • es eine Objekteigenschaft machen, oder
  • geben sie als Parameter, wenn B von A aufrufen.

Wenn Ihr Programm ziemlich klein ist dann Globals ist nicht so schlecht. Sonst würde halte ich die dritte Methode:

function A()
{
    var rand_num = calculate_random_number();
    B(rand_num);
}

function B(r)
{
    use_rand_num(r);
}

Andere Tipps

Ich denke, die beste Wahl hier kann einen Single global-scoped Variable zu definieren sein, und Ihre Variablen dort Dumping:

var MyApp = {}; // Globally scoped object

function foo(){
    MyApp.color = 'green';
}

function bar(){
    alert(MyApp.color); // Alerts 'green'
} 

Niemand sollte dich schreien für so etwas wie die oben zu tun.

Betrachten Namespaces mit:

(function() {
    var local_var = 'foo';
    global_var = 'bar'; // this.global_var and window.global_var also work

    function local_function() {}
    global_function = function() {};
})();

Sowohl local_function und global_function haben Zugriff auf alle lokalen und globalen Variablen.

Bearbeiten : Ein weiteres gemeinsames 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
    };
})();

Die returned Eigenschaften können nun über das Namespace-Objekt zugegriffen werden, zum Beispiel ns.foo, während immer noch Zugriff auf lokale Definitionen beibehalten werden.

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 ist oben nicht gerade eine curried Funktion, sondern es erreicht das Ergebnis einen bestehenden Wert beibehalten wird, ohne Variablen auf den globalen Namensraum hinzugefügt oder eine andere Objekt-Repository für sie erforderlich ist.

Wenn eine andere Funktion, eine Variable verwenden, muss man es auf die Funktion als Argument übergeben.

Auch globale Variablen sind nicht von Natur aus böse und böse ist. Solange sie dort verwendet werden, richtig ist kein Problem mit ihnen.

Wenn es eine Chance, dass Sie diesen Code wiederverwenden, dann würde ich wahrscheinlich die Mühe macht, mit einer objektorientierten Perspektive zu gehen. den globalen Namespace kann gefährlich sein - Sie laufen Gefahr, von harten Fehler zu finden aufgrund Variablennamen, die wiederverwendet erhalten. Normalerweise beginne ich durch einen objektorientierten Ansatz für etwas mehr als ein einfacher Rückruf, damit ich die neu zu schreiben, was nicht zu tun haben. Jedes Mal, dass Sie eine Gruppe von verwandten Funktionen in Javascript, ich denke, es ist ein Kandidat für einen objektorientierten Ansatz.

Ein weiterer Ansatz ist eine, die ich von einer Douglas Crockford Forum Post abgeholt ( http : //bytes.com/topic/javascript/answers/512361-array-objects ). Hier ist sie ...

Douglas Crockford schrieb:

15. Juli '06

"Wenn Sie wollen von ID-Objekten abzurufen, dann sollten Sie ein Objekt verwenden, nicht ein Array. Da Funktionen auch Objekte sind, können Sie die Mitglieder in den Laden Funktion selbst. "

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"

objFacility.wlevine

Die Objekte Objekte sind nun frei zugängig aus einer anderen Funktion.

Ich fand dies auf die ursprüngliche Frage im Zusammenhang sehr hilfreich sein:

Gibt den Wert, den Sie in FunctionOne nutzen möchten, dann rufen Sie FunctionOne innerhalb FunctionTwo, dann ordne das Ergebnis in eine frische var und Referenz diese neue var innerhalb FunctionTwo. Dies sollte Ihnen ermöglichen, die var in FunctionOne erklärt zu verwenden, innerhalb FunctionTwo.

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();

Ich weiß nicht, Besonderheiten Ihrer Frage, aber wenn die Funktion den Wert muss dann kann es ein Parameter durch den Aufruf übergeben werden.

Globals gilt als schlecht, weil Globals Zustand und mehr Modifikatoren können hart erstellen Code und seltsame Fehlern zu folgen. Für viele Akteure das Hantieren mit etwas kann Chaos schaffen.

Sie vollständig die Ausführung von JavaScript-Funktionen steuern können (und übergeben Variablen zwischen ihnen) benutzerdefinierten jQuery-Ereignissen mit .... Mir wurde gesagt, dass dies alles über diese Foren nicht möglich ist, aber ich habe etwas Arbeits, die genau das tut (sogar mit einem ajax-Aufruf).

Hier ist die Antwort (WICHTIG: Es ist nicht die Antwort geprüft, sondern die Antwort von mir „Emile“):

Wie eine Variable über zurückgegeben werden mehrere Funktionen - Javascript / jQuery

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top