In traditionellen Konzepten wird angenommen, dass JavaScript -Funktionen die Referenzübergabe (auch als Zeigerpass bezeichnet) übergeben, und einige Menschen glauben, dass sowohl Wertpasser als auch Referenzübergang verfügbar sind. Was ist also los, wenn der JS -Parameter passt? Tatsächlich kann die folgende Demonstration in Java verwendet werden
Lassen Sie uns zunächst eine einfachere, grundlegende Art der Lieferung erhalten:
Funktion add (num) {num+= 10; return num;} num = 10; alert (add (num)); aelrt (num); // Ausgabe 20,10Für die Ausgänge 20 und 10 wird nach der offiziellen Erläuterung von JS eine Kopieraktion durchgeführt, wenn die Grundtypparameter übergeben werden, so dass die extern deklarierte Variable Num und die Funktion der Funktionsparameter genau den gleichen Wert haben, jedoch völlig unterschiedliche Parameteradressen aufweisen. Niemand kennt sich und der Funktionsparameter Num Stack Frame wird angezeigt, wenn der Funktionsaufruf zurückgibt. Das Ändern der Num der Funktionsparameter hat daher keinen Einfluss auf die ursprünglichen externen Variablen.
Schauen wir uns einen komplexeren Pass für Objektreferenztyp an:
Funktion setName (obj) {obj.name = "ted";} var obj = new Object (); setName (obj); alert (obj.name); // Ausgabe tedThe essence of the above code is: create an object object, assign it reference to obj (in C, it is directly an assignment of a memory address), and then when passing the function parameters, I did the same thing as the previous method, copied a stack frame to obj of the function parameter, and both have the same value (it may be understood as the address of the object object), and then when changing the setName, the value of the object object itself (called a variable class in Java) und nach Abschluss der Änderung muss auch der Stapelrahmen, der dem Funktionsparameter entspricht, aufgetaucht werden.
Daher ist die entsprechende Ausgabe der Wert des Objektobjekts nach dem Ändern
Dann können einige Freunde fragen, dies kann auch als Referenzpass (Zeigerpass) verstanden werden? Nein, streng genommen gibt es in Sprachen, die Java ähneln, keine Zeiger. In Java wird der obige Prozess als Parsingprozess von symbolischer Referenz auf direkte Referenz bezeichnet. In C ist ein Zeiger ein Typ mit fester Länge (2 Bytes in den meisten C -Compilern), aber in Java ähnliche Sprachen haben Referenzen auch ihre eigenen Eigenschaften und Methoden, aber Sie können nicht direkt auf ihn zugreifen und steuern, daher ist es auch in gewissem Sinne ein Objekt. Dieser Mechanismus vermeidet auch stark Speicherleckage, und der Begriff wird als Speicherstrukturzugriffsmechanismus bezeichnet.
Um den obigen Punkt zu beweisen, ist das obige Beispiel leicht modifiziert:
FunktionsetName (obj) {obj.name = "ted"; obj = neues Objekt (); obj.name = "mary";} var obj = new Object (); setName (obj); alert (obj.name); // output tedDer einzige Unterschied zwischen diesem Beispiel und dem vorherigen Beispiel besteht darin, dass dem Funktionsparameter OBJ ein neues Objekt zugewiesen wird, so dass der Funktionsparameter der Funktion und der ursprüngliche Referenz -OBJ -Parameter vollständig unterschiedliche Werte und Speicheradressen aufweist.
Der obige Artikel spricht kurz darüber, ob das Übergeben von JavaScript -Funktionsfunktionen das Vergeben von Wert oder Referenzübergabe ist, was ich mit Ihnen geteilt habe. Ich hoffe, es kann Ihnen eine Referenz geben und ich hoffe, Sie können Wulin.com mehr unterstützen.