Erfassen des aktuellen Werts einer Variablen
Habe ich eine variable myVariable
sich ständig ändern. Irgendwann möchte ich erfassen die Wert von myVariable
(nicht Referenz zu myVariable
) in eine andere variable myVariableAtSomePoint
.
Beispiel-code:
var myVariable = 1;
function test () {
var myVariableAtSomePoint= myVariable;
console.log(myVariableAtSomePoint);
}
myVariable = 2;
test(); //Prints 2, instead of 1.
- ist
myVariable
ein Objekt? - Ja, es speichert eine Zahl (integer).
- Was ist es über
myVariableAtSomePoint = myVariable;
, die nicht funktionieren? - Speichert Verweis
myVariable
(so dassmyVariableAtSomePoint
wird auch mit der Zeit ändern). Ich willmyVariableAtSomePoint
statisch sein. - Wenn Sie mit jQuery:
var myVariableAtSomePoint = jQuery.extend({}, myVariable);
. Wenn nicht, kopieren Sie die source-code/Idee fürjQuery.extend
von jQuery 😛 - Auch Sie sagte, es ist nur "eine Zahl (integer)".
- Ich glaube, er sagte, es ist ein Objekt, speichert eine Zahl(ex:
{n:3}
aber ich bin verwirrt, wie gut 😀 - Ich habe Beispiel-code zu klären
- Ich habe Beispiel-code zu klären
- OK, gut, wenn es wirklich nur eine Zahl ist, dann ist dein Verständnis davon, was abtretungserklärung tut, ist falsch. Das einfache Zuweisung kopiert den Wert der Zahl (wie, 3 oder 2021 oder was auch immer) auf die andere variable, und spätere änderungen an der "myVariable" wird absolut nicht beeinträchtigt "myVariableAtSomePoint".
- Wenn Sie möchten, um darüber nachzudenken, wie "kopieren einer Referenz", alternativ, dann denken von zahlen als unveränderliche Objekte. Der einzige Weg, um "myVariable" nehmen, die auf einem anderen numerischen Wert, es zu machen, verweisen auf eine unterschiedliche Anzahl Objekt. Auch diese änderung wirkt sich nicht auf "myVariableAtSomePoint".
- Das problem ist nicht über Referenzen. Sie fordern
test
nach von Ihnen geänderten Wert. Der code in der test-Funktion wird erst ausgeführt, wenn Sie die Funktion aufrufen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie erwähnen in Ihren Kommentaren, dass
myVariable
ist eine Zahl. DamyVariable
Häuser eine primitive Art, einfach folgenden code verwenden:Werfen Sie einen Blick auf JAVASCRIPT: ÜBERGABE PER WERT ODER PER REFERENZ. Hier ein Zitat:
Ich würde auch vorschlagen, zu Lesen: Wie melde ich mich richtig Klonen ein JavaScript-Objekt?
EDIT:
Ich glaube, Sie gehen davon aus, dass die Platzierung der Funktion in der code wirkt sich auf den Wert der Variablen. Tut es aber nicht. Siehe Beispiele unten:
Diese:
Ist die gleiche wie diese:
Dein problem ist, dass man die änderung der Wert der
myVariable
vor du bist die Zuordnung zumyVariableAtSomePoint
. Für diese arbeiten, wie Sie wollen, Sie müssen rufen Sie dietest()
Funktion vor ändern Sie den Wert dermyVariable
WICHTIG: egal, die Platzierung der Funktion, wird der code innerhalb
test()
wird nicht ausgeführt, bevor Sie die Funktion aufrufen.swap(a, b)
Funktion wie können Sie in C++ mit Referenz-Parameter ("&p")? In JavaScript (und Java), können Sie nicht. Ja, Sie können Bearbeiten Sie die Eigenschaften von Objekten übergeben, und ja, das bedeutet, dass du schon übergeben eine Referenz auf ein Objekt, aber das ist einfach nicht das, was "pass by reference" bedeutet. Es ist ein sehr präziser Begriff.test(); // Prints 1 myVariable = 2; test(); // Prints 1
Ich vielleicht nicht Lesen Sie die ganze Antwort in den richtigen Kontext aber sollte es nicht trotzdem drucken Sie 1 und dann 2 in die jeweiligen Aufrufe an test() ?Die variable enthält nur die Referenz und nichts anderes. Wenn Sie möchten, dass eine Kopie des Objekts, das die variable verweist, müssen Sie einige Weg, um kopieren Sie das Objekt.
Entweder Sie implementieren können, ein copy-Methode auf das Objekt selbst (wenn du weißt, welche Eigenschaften es hat...) oder Sie Durchlaufen können alle Eigenschaften des Objekts mit einem
for ... in
Schleife und kopieren Sie Sie in eine neu zugewiesene Objekt.So etwas wie:
o.hasOwnProperty(x)
um zu verhindern, dass die Funktionen vono
aus, die kopiert werden, mehr als gut.o
. Bei einer tiefen Kopieo
kann abgerufen werden, mithilfe der gleichen Technik, die rekursiv die Werte, auf dieo[x]
.Code:
Weisen Sie 2 bis
myVariable
, und weisen Sie dannmyVariable
(die hat jetzt Wert 2)myVariableAtSomePoint
übertest()
so ist es natürlich 2. Sie brauchen keine Magie kopieren hier (da zahlen sind, primitiv), nur assigment ist genug.Müssen Sie nur kopieren Sie jede Eigenschaft auf das Objekt, natürlich, wenn es sub-Objekte, die Sie erhalten möglicherweise durch Verweis übergeben, sowie: