Frage an function, variables, javascript, call – Variable in einer Javascript-Funktion am Leben erhalten

14

Ich möchte eine Variable in einer Funktion unterbringen. Diese Variable ändert den Status in Abhängigkeit von der Benutzerinteraktion

<code>function plan_state(current){
    if (current != ''){
     state = current;
    }
    else {
     return state;
    }
}
</code>

Wenn das Dokument geladen wird, rufe ich plan_state ('ich') auf.

Wenn bestimmte Dinge passieren, kann ich plan_state ('geliebt') nennen

das problem, ich führe eine funktion aus und möchte den aktuellen zustand überprüfen ..

<code>alert(plan_state());
</code>

Ich bekomme undefiniert zurück und sollte zumindest 'ich' sein, wenn ich dieses Onload setze.

Was mache ich falsch?

wird es in der Funktion onload deklariert, indem es auf 'me' gesetzt wird? Daniel Hunter
Wo deklarieren Sie den Staat? Loktar

Deine Antwort

2   die antwort
44

Die Funktion ist nicht statusbehaftet, da die Statusvariable innerhalb der Funktion deklariert wird und daher nur für die Lebensdauer des Funktionsaufrufs vorhanden ist. Eine einfache Lösung wäre, die Variable global außerhalb der Funktion zu deklarieren. Das istSchlecht Schlecht Schlecht Schlecht.

Ein besserer Ansatz ist die Verwendung desModulmuster. Dies ist ein wichtiges Muster, um zu lernen, ob Sie es mit der JavaScript-Entwicklung ernst meinen. Es aktiviert den Zustand mittels interner (privater Variablen) und stellt eine Reihe von Methoden oder Funktionen zur Verfügung, um den Zustand zu ändern oder zu erhalten (wie bei der objektorientierten Programmierung).

<code>    var stateModule = (function () {
        var state; // Private Variable

        var pub = {};// public object - returned at end of module

        pub.changeState = function (newstate) {
            state = newstate;
        };

        pub.getState = function() {
            return state;
        }

        return pub; // expose externally
    }());
</code>

sostateModule.changeState("newstate"); legt den Zustand fest

undvar theState = stateModule.getState(); bekommt den Staat

Aber ist stateModule jetzt nicht auch global? Wo liegt also genau der Unterschied zu einem String var stateModule, dem nur ein Wert zugewiesen wird? kaiser
Was ist der Unterschied zwischen dem Umbrechen des Status einer Funktion und dem Anzeigen interner Funktionen, die diesen Status ändern, und dem Anzeigen dieser Funktionen in einem ES6-Modul und globalen Let-Variablen am oberen Rand Ihres ES6-Moduls und dem Exportieren von Funktionen, die den Status dieser lokalen Variablen ändern können? PositiveGuy
Ich bin froh, dass es geholfen hat. Mit diesem Muster werden Sie in kürzester Zeit ein JavaScript-Ninja! Ich habe den Funktionsaufruf-Fehler thx behoben, um darauf hinzuweisen. reach4thelasers
Er lernt JavaScript / Programmierung und die Feinheiten des Umfangs. Was hätte er aus der Verwendung einer globalen Variablen gelernt / gewonnen, als ein schlechter Entwickler zu werden? Ihr Beispiel würde funktionieren, würde ihm aber nicht helfen, das Modulmuster zu verstehen. Wir sind alle hier, um zu lernen, oder? reach4thelasers
1

Ich glaube, der Umfang Ihrer Variablen ist zu "niedrig". durch Definieren der Variablen innerhalb der Funktion, entweder als Parameter oder explizit alsvarist es nur innerhalb der Funktion zugänglich. Um das zu erreichen, wonach Sie suchen, können Sie entweder die Variable außerhalb des Funktionsumfangs implementieren, und zwar auf einer globaleren Ebene (nicht wirklich empfohlen).

Nachdem Sie Ihre Frage erneut gelesen haben, ist sie jedoch leicht verfehlt. Möchten Sie nicht zurückkehrenstate ungeachted dercurrent? Ich denke, Sie könnten nach so etwas sein:

<code>var state;
function plan_state(current)
{
    if (current != '' && current != state)
    {
        state = current;
    }
    return state;
} 
</code>

Alternative Objektstruktur:

<code>function StateManager(state)
{
    this.state = state;

    this.getState = function(current)
    {
        if (current != '' && current != this.state)
        {
            this.state = current;
        }
        return this.state;
    }
}

// usage
var myStateManager = new StateManager("initial state here");
var theState = myStateManager.getState("some other state");
</code>
Vielen Dank, Richard Daniel Hunter
Ich dachte, indem ich die Variable in einer Funktion unterbrachte, war es eine Möglichkeit, globale Variablen zu vermeiden Daniel Hunter
Wenn Sie eine Variable innerhalb einer Funktion deklarieren, ist sie nicht global, das ist richtig. Die Lebensdauer dieser Variablen ist jedoch nur aktiv, während die Funktion verwendet wird. Wenn die Funktion existiert, existiert die Variable "nicht mehr". Vielleicht möchten Sie ein Objekt betrachten :) Richard

Verwandte Fragen