Heim  >  Artikel  >  Web-Frontend  >  Die Beziehung zwischen JavaScript-Variablen, Wertübertragung, Adressübertragung undparameter_jquery

Die Beziehung zwischen JavaScript-Variablen, Wertübertragung, Adressübertragung undparameter_jquery

WBOY
WBOYOriginal
2016-05-16 15:48:57981Durchsuche

Lassen Sie die Ernte zunächst eine Weile trocknen:

1.Javascript-Variablen enthalten zwei Arten von Werten, einer ist ein Referenztypwert und der andere ist ein Basistypwert. Zu den Referenztypen gehören: Array, Objekt, Funktion (es versteht sich, dass nicht-Basistypen Referenztypen sind: undefiniert, null, string, boolean, number

).

2. Der Mechanismus zum Übergeben von Funktionsparametern besteht darin, den Variablenwert zu kopieren.

Im Buch heißt es: „Das Kopieren des Werts außerhalb der Funktion in den Parameter innerhalb der Funktion ist dasselbe wie das Kopieren des Werts von einer Variablen in eine andere. Die Übertragung von Basistypen ist dieselbe wie das Kopieren von Basistypvariablen. und die Übertragung von Referenztypen ist dasselbe wie die Kopie der Referenztypvariablen „

.

" Wenn eine Variable einen Wert eines Referenztyps kopiert, wird auch eine Kopie des im Variablenobjekt gespeicherten Werts in den für die neue Variable zugewiesenen Speicherplatz kopiert. Der Unterschied besteht darin, dass die Kopie des Werts tatsächlich ein Zeiger ist , und dieser Zeiger zeigt auf ein im Heap gespeichertes Objekt. Nach Abschluss des Kopiervorgangs verweisen die beiden Variablen tatsächlich auf dasselbe Objekt. Daher wirkt sich die Änderung einer der Variablen auf die andere Variable aus.

[Hinweis: Das Kopieren des Werts des Referenztyps ist die einzige Möglichkeit, die Adresse zu übergeben]

3. Parameter sind eigentlich lokale Variablen der Funktion.

--------------------------------- --- -----------

Erklärung grundlegender Konzepte:

Wert übertragen: Wert von A auf B übertragen, B ändern, A ändert sich nicht entsprechend, B speichert den gleichen Wert wie A; Adresse übertragen: Übertragen Sie die Adresse von A an B, ändern Sie B und A ändert gleichzeitig nur die Adresse von A (ähnlich einer Computerverknüpfung).


Daten mit Werttyp werden in einer Variablen auf dem Stapel gespeichert. Das heißt, indem Speicherplatz im Stapel zugewiesen und der enthaltene Wert direkt gespeichert wird, stellt der Wert die Daten selbst dar. Werttypdaten haben eine schnellere Zugriffsgeschwindigkeit.

Daten mit einem Referenztyp befinden sich nicht auf dem Stapel, sondern werden im Heap gespeichert. Das heißt, durch die Zuweisung von Speicherplatz im Heap wird der enthaltene Wert nicht direkt gespeichert, sondern es wird auf den zu speichernden Wert verwiesen, und sein Wert stellt die angegebene Adresse dar. Wenn Sie mit einem Referenztyp auf Daten zugreifen, müssen Sie den Inhalt der Variablen auf dem Stapel überprüfen, die auf tatsächliche Daten im Heap verweist. Daten vom Referenztyp haben eine größere Speichergröße und eine geringere Zugriffsgeschwindigkeit als Daten vom Werttyp.

--------------------------------- --- -----------

Hier sind drei Fragen.

[Frage 1]:

Warum wird die Außenwelt nicht gestört, nachdem die Funktion „Änderung(a)“ ausgeführt wurde?

<script>
var a = [1, 2, 3];
function change(a) {
 console.log(a);//[1,2,3]
 a = 2;   //传值
 console.log(a);//2
}
change(a);
console.log(a);  //[1,2,3] 
</script>

Antwort auf Frage 1: Da der Ausführungsprozess von change(a) so abläuft, wird das Objekt a (Array) nach der ersten Übergabe an change in den Parameter a von change kopiert. Dann ist a=2 eine Zuweisungsanweisung und wird zur Wertübergabe. Zu diesem Zeitpunkt ist a=2 ein Werttyp und beinhaltet nicht die Frage der Referenzadresse. Es hat also keinen Einfluss auf die externe a.

[Frage 2]:

Warum wird die Außenwelt gestört, nachdem die Funktion „Änderung(a)“ ausgeführt wurde?

<script>
 var a = [1, 2, 3];
 function change() { 
  a = 2;//传值
 }
 change();
 console.log(a);  //2 
</script>

Antwort auf Frage 2: Beim Ausführen von change() sucht die Funktion in ihrer eigenen Ausführungsumgebung nach der Bereichskette. Das Aktivierungsobjekt enthält nicht die Variable a, daher sucht sie entlang der Bereichskette nach oben, um die globale Ausführung zu finden In der Umgebung wird die Variable a gefunden, sodass zu diesem Zeitpunkt das interne a der Funktion und das externe a dieselbe Adresse im Speicher haben. Wenn sich das interne a der Funktion ändert, ändert sich natürlich auch das externe.

Analyse: Der Unterschied zwischen Frage 2 und Frage 1 besteht darin, dass Frage 2 keine Parameter einführt und daher kein Kopieren von Variablen erfordert.

[Frage 3]:

Warum wird die Außenwelt gestört, nachdem die Funktion „Änderung(a)“ ausgeführt wurde?

<script>
 var a = [1, 2, 3];
 function change(b) { 
  b[0] = 2;
 }
 change(a);
 console.log(a);  //[2,2,3]
</script>

Antwort auf Frage 3: Dies ist sehr ähnlich zu Frage 1. Der einzige Unterschied besteht darin, dass a=2 durch b[0]=2 ersetzt wird. Ich war zuerst verwirrt. Parameter b sollte ein kopierter Wert sein. Wie kann er sich auf die Außenseite von a auswirken?

Tatsächlich ist Parameter b der kopierte Wert von a, wenn die Änderungsfunktion ausgeführt wird. Da a ein Referenztyp ist, greifen b und a innerhalb der Funktion per Referenz auf ein Adressobjekt zu. Das Auftreten von b[0]=2 hat keinen Einfluss auf die Tatsache, dass b und a auf dasselbe Objekt innerhalb der Funktion verweisen.

[Frage 4]:

Warum wird die Außenwelt nicht gestört, nachdem die Funktion „Änderung(a)“ ausgeführt wurde?

 var a = [1, 2, 3];
 function change(b) { 
  console.log(b);//[1,2,3]
  b=2;
  b[0] = 2;
 }
 change(a);
 console.log(a);  //[1,2,3]

Antwort auf Frage 4: Der Ausführungsprozess von Änderung (b) ist wie folgt: Objekt a wird an die Änderungsfunktion übergeben und der Wert und die Adresse werden nach b kopiert. Der Satz b = 2, b wird zu diesem Zeitpunkt zu einem Werttyp und beinhaltet nicht die Frage der Adressreferenz. Der Satz b [0] = 2 ist danach tatsächlich bedeutungslos, da b zu diesem Zeitpunkt kein Array mehr ist. und natürlich gibt es keine Indexierungsmethode wie b[0]. Daher verschwindet die Adressreferenzbeziehung zwischen b und a tatsächlich nach b = 2. Zu diesem Zeitpunkt ist das externe a immer noch [1,2,3];

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er gefällt Ihnen allen.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn