2017-01-30 5 views
4

Also in meinem js Code ich eine globale Variable, die ihren Wert mehrmals verändert, zum BeispielHolen Sie sich alle Werte der Variablen JS mit

var x = 0; 
... 
x = 10; 
... 
x = 5; 

Gibt es eine Möglichkeit, „Geschichte“ von x ohne Speichern seiner zu bekommen Wert in anderen Variablen? Wie, gibt es eine Funktion zu erkennen, dass zu einem Zeitpunkt x gleich 10 war?

+0

Sie haben etwas damit durch google ?? –

+0

Ohne eine History-Array-Variable zu verwenden, sehe ich diesen Arbeitskollegen nicht - ich könnte natürlich falsch liegen. – Terrance00

+0

Nein, ich habe versucht, aber nicht gelingen – Coffee

Antwort

9

Nein, sobald einer Variablen ein Wert zugewiesen wird, wird der vorherige Wert dieser Variablen überschrieben. Es wird nirgends beibehalten. (Wenn dies der Fall wäre, wäre dies ein Albtraum für die Speicherverwaltung.)

Sie könnten eine Objekteigenschaft erstellen, die einen Verlauf beibehält, wenn Sie möchten, indem Sie eine Setter-Funktion verwenden. grobes Beispiel:

var obj = { 
 
    _fooValue: undefined, 
 
    fooHistory: [], 
 
    set foo(value) { 
 
    this.fooHistory.push(this._fooValue); 
 
    this._fooValue = value; 
 
    }, 
 
    get foo() { 
 
    return this._fooValue; 
 
    } 
 
}; 
 

 
obj.foo = 0; 
 
obj.foo = 5; 
 
obj.foo = 42; 
 
console.log(obj.fooHistory);

In diesem Beispiel hat die Geschichte nicht den aktuellen Wert zu enthalten, nur die vorhergehenden, und es den aktuellen Wert in einer anderen Objekt-Eigenschaft speichert Mittel, die Bypass-Code könnte der Setzer. Es gibt viele Verbesserungen, die Sie tun können. Wenn Sie dachten, war es wichtig, können Sie es sperren mehr:

var obj = (function() { 
 
    // These two vars are entirely private to the object 
 
    var fooHistory = []; 
 
    var fooValue; 
 
    
 
    // The object we'll assign to `obj` 
 
    return { 
 
    set foo(value) { 
 
     fooHistory.push(fooValue); 
 
     fooValue = value; 
 
    }, 
 
    get foo() { 
 
     return fooValue; 
 
    }, 
 
    get fooHistory() { 
 
     // Being really defensive and returning 
 
     // a copy 
 
     return fooHistory.slice(0); 
 
    } 
 
    } 
 
})(); 
 

 
obj.foo = 0; 
 
obj.foo = 5; 
 
obj.foo = 42; 
 
console.log(obj.fooHistory);

+0

Wie wird der aktuelle (letzte) Wert übersprungen? –

+1

Ah, ich sehe, Sie drücken nur vorherige, keine aktuelle)) –

+0

@vp_arth: Yup. :-) –

0

Ja, es gibt. Verwenden des Time Travelling-Debugging im Microsoft Edge-Browser. Überprüfen Sie this aus.

0

Ich bin kein JS-Spezialist, aber als allgemeine Idee für jede OOP-Sprache würde ich vorschlagen, spezielle Klasse für x zu erstellen (von Integer in Ihrem Beispiel geerbt), die Setter und einige Geschichte Array-Liste überschrieben hat. Wenn Sie also einen neuen Wert festlegen, wird dieser in Ihrem Verlauf gespeichert.

Sie müssen nur den Variablentyp ändern, nicht den Code, der damit arbeitet. Ich glaube auch nicht, dass es dafür in irgendeiner Sprache eine Standardlösung gibt. Wahrscheinlich einige dynamische Introspektoren, aber diese wären noch komplexer als meine Idee.

1

Sie können Variable wie Array verwenden und nächsten Wert auf dieses Array umschalten. Und es zu verwenden, nehmen Sie zuerst Element:

var x = []; 
... 
x.unshift(10); 
... 
x.unshift(5); 

var currentX = x[0]; 
var allValues = x; 
Verwandte Themen