Heim Web-Frontend js-Tutorial Codedetails von Funktionsaufrufen in JavaScript

Codedetails von Funktionsaufrufen in JavaScript

Mar 23, 2017 pm 02:26 PM

Viele Menschen sind beim Erlernen von JavaScript möglicherweise auf Verwirrung über die Bereitstellungsmethode Funktionsparameter gestoßen. Im Sinne einer gründlichen Untersuchung werde ich ein Tutorial mit Ihnen teilen über JavaScript. Wissen über Funktionsaufrufe, interessierte Freunde, lasst uns gemeinsam lernen

Definition

Viele Menschen sind beim Lernen möglicherweise auf Funktionsparameter gestoßen Javascript Ich bin verwirrt über die Übertragungsmethode und möchte im Sinne einer eingehenden Analyse einige Antworten im Quellcode finden. Bevor ich dies tue, muss ich jedoch zunächst einige Konzepte klären. Verzichten Sie auf die inhärenten Namen von Wertübergabe, Referenzübergabe usw. und kehren Sie zum Englischen zurück:

Call by Reference && Call by Value && Call by Sharing

Sie verstehen wir unter Referenzübergabe und Wertübergabe in C++. Die dritte ist verwirrender. Die offizielle Erklärung lautet: erhält die Kopie des Verweises auf das Objekt . Lassen Sie es mich in Laienbegriffen erklären:

Objekt kann als Sammlung von Schlüssel verstanden werden. Das Objekt bezieht sich auf die Daten, auf die der Schlüssel zeigt (ich werde nicht näher darauf eingehen, ob es sich um einen Zeiger handelt Implementierung oder eine C++-Referenzimplementierung). Was die Funktion erhält, ist eine Kopie einer -Variable . Die Variable enthält einen Verweis auf das Objekt und wird als Wert übergeben.

Dann ist es offensichtlich, dass der Typparameter Objekt, den wir bei der Übergabe von Funktionsparametern erhalten, tatsächlich eine Kopie des tatsächlichen Parameters ist, sodass es nicht möglich ist, den Zeiger des Typparameters direkt zu ändern ; weil das Objekt selbst Die Schlüssel sind alle Referenzen, daher ist es möglich, den Zeiger des Schlüssels zu ändern.

Beweis

Ein paar einfache Codeteile können es beweisen

Code 1: Die Funktion kann die angezeigten Daten ändern per Taste

let func = obj => { obj.name = 'Dosk' };
let obj = {name : 'Alxw'};
console.log(obj); //{ name: 'Alxw' }
func(obj)
console.log(obj); //{ name: 'Dosk' }
Nach dem Login kopieren

Code 2: Die Funktion kann obj nicht ändern

let func = obj => { obj = {} };
let obj = {name : 'Alxw'};
console.log(obj); //{ name: 'Alxw' }
func(obj)
console.log(obj); //{ name: 'Alxw' }
Nach dem Login kopieren

Code 3: Das interne obj und das externe === Ergebnis sind gleich

let def = {name : 'Alxw'};
let func = obj => { console.log(obj === def) };
func(def); //true
Nach dem Login kopieren

Also der dritte Teil des Codes. Da obj eine Kopie von def ist, warum kann die Operation === immer noch wahr sein? Bedeutet das nicht, dass die Operation === die Adresse im Speicher für das Objekt vergleicht? Wenn es sich um eine Kopie handelt, sollte sie falsch sein?

Kehren wir also zum Quellcode von Google V8 zurück, um uns das anzusehen.

Tief in Google V8

Werfen wir einen Blick auf den streng gleichen Operationscode-Teil im Quellcode:

bool Object::StrictEquals(Object* that) {
 if (this->IsNumber()) {
  if (!that->IsNumber()) return false;
  return NumberEquals(this, that);
 } else if (this->IsString()) {
  if (!that->IsString()) return false;
  return String::cast(this)->Equals(String::cast(that));
 } else if (this->IsSimd128Value()) {
  if (!that->IsSimd128Value()) return false;
  return Simd128Value::cast(this)->Equals(Simd128Value::cast(that));
 }
 return this == that;
}
Nach dem Login kopieren

Es sieht so aus, als ob dies theoretisch der letzte Fall sein sollte. Wenn def und obj unterschiedliche Objekte sind, sollte dadurch nicht false zurückgegeben werden. Eigentlich nein, eines wird ignoriert: Wenn ein Objekt intern instanziiert wird, ist Google V8 selbst eine dynamische Instanziierung, und wir wissen, dass in kompilierten Sprachen die dynamische Instanziierung nur im Heap-Speicher durchgeführt werden kann, dh nur Zeiger verwendet werden. Der Beweis dieser Schlussfolgerung beinhaltet die Implementierung von Local, Handle und anderen Klassen. Es gibt einen einfachen Weg, dies zu beweisen 🎜> Durchsuchen Sie den -Quellcode. Alle Stellen, an denen aufgerufen werden, werden direkt übergeben, ohne dass die Adressoperation ausgeführt wird. Object::StrictEquals

Einige Leute fragen sich jedoch möglicherweise, dass es theoretisch möglich ist, Object zu ändern, da die als Wert übergebene Variable einen Verweis auf Object enthält. Warum kann der dritte Teil des Codes nicht geändert werden?

Der Grund ist sehr einfach, denn unsere sogenannten Operationen auf der logischen Ebene der Javascript-Sprache rufen lediglich die Instanzmethode von Google V8 auf und es ist unmöglich, bis zu diesem Punkt zu arbeiten (natürlich ein potenzieller Fehler). wird nicht gezählt -. -)

Neudefinition

Ich denke, ich kann den Anruf noch einmal erklären, indem ich ihn hier teile:

Es wird zwar als Wert übergeben, aber der Inhalt enthält den Zeiger des Objekts, und dieser Zeiger kann nicht geändert werden. Er wird von mehreren Variablen gemeinsam genutzt.

Noch ein einfacher Beweis

Komm, schau dir den Quellcode an

V8_DEPRECATE_SOON("Use maybe version",
         Local<Value> Call(Local<Value> recv, int argc,
                  Local<Value> argv[]));
V8_WARN_UNUSED_RESULT MaybeLocal<Value> Call(Local<Context> context,
                       Local<Value> recv, int argc,
                       Local<Value> argv[]);
Nach dem Login kopieren
Das Obige steht kurz bevor aufgegeben Die

Schnittstelle wird verwendet. Es kommt vor, dass der Versionscode, den ich gesehen habe, einen Großteil dieses Codes enthält, der bald veraltet ist. Der Fokus liegt auf der zweiten Schnittstelle, die die einzige aufrufende Schnittstelle der Funktion ist. Das im Inneren ruft schließlich die Bitkopie von C++ auf, sodass leicht nachgewiesen werden kann, dass es als Wert übergeben wird. Local<Value>

könnte der entscheidende Punkt sein

Vergessen Sie nicht, dass die von uns definierten Variablen alle die Form

haben, also sie Objekte werden von Objekten gemeinsam genutzt. Was wir in Javascript Variablen nennen, bezieht sich nicht direkt auf Instanzen von Objekten!!!Handle<Object>

Das Letzte

Kurz gesagt, es kann schwierig sein, es zu verstehen oder sogar Fehler zu enthalten, aber es ist wichtig, die Merkmale auf der Ebene der Javascript-Sprache bestimmen zu können.

Das Obige ist der Funktionsaufruf in Javascript, den Ihnen der Herausgeber vorgestellt hat. Ich hoffe, er wird Ihnen hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Herausgeber wird Ihnen rechtzeitig antworten . Ich möchte mich auch bei Ihnen allen für Ihre Unterstützung der Script House-Website bedanken!

Das obige ist der detaillierte Inhalt vonCodedetails von Funktionsaufrufen in JavaScript. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So implementieren Sie ein Online-Spracherkennungssystem mit WebSocket und JavaScript So implementieren Sie ein Online-Spracherkennungssystem mit WebSocket und JavaScript Dec 17, 2023 pm 02:54 PM

So implementieren Sie mit WebSocket und JavaScript ein Online-Spracherkennungssystem. Einführung: Mit der kontinuierlichen Weiterentwicklung der Technologie ist die Spracherkennungstechnologie zu einem wichtigen Bestandteil des Bereichs der künstlichen Intelligenz geworden. Das auf WebSocket und JavaScript basierende Online-Spracherkennungssystem zeichnet sich durch geringe Latenz, Echtzeit und plattformübergreifende Eigenschaften aus und hat sich zu einer weit verbreiteten Lösung entwickelt. In diesem Artikel wird erläutert, wie Sie mit WebSocket und JavaScript ein Online-Spracherkennungssystem implementieren.

WebSocket und JavaScript: Schlüsseltechnologien zur Implementierung von Echtzeitüberwachungssystemen WebSocket und JavaScript: Schlüsseltechnologien zur Implementierung von Echtzeitüberwachungssystemen Dec 17, 2023 pm 05:30 PM

WebSocket und JavaScript: Schlüsseltechnologien zur Realisierung von Echtzeit-Überwachungssystemen Einführung: Mit der rasanten Entwicklung der Internet-Technologie wurden Echtzeit-Überwachungssysteme in verschiedenen Bereichen weit verbreitet eingesetzt. Eine der Schlüsseltechnologien zur Erzielung einer Echtzeitüberwachung ist die Kombination von WebSocket und JavaScript. In diesem Artikel wird die Anwendung von WebSocket und JavaScript in Echtzeitüberwachungssystemen vorgestellt, Codebeispiele gegeben und deren Implementierungsprinzipien ausführlich erläutert. 1. WebSocket-Technologie

Verwendung von JavaScript und WebSocket zur Implementierung eines Echtzeit-Online-Bestellsystems Verwendung von JavaScript und WebSocket zur Implementierung eines Echtzeit-Online-Bestellsystems Dec 17, 2023 pm 12:09 PM

Einführung in die Verwendung von JavaScript und WebSocket zur Implementierung eines Online-Bestellsystems in Echtzeit: Mit der Popularität des Internets und dem Fortschritt der Technologie haben immer mehr Restaurants damit begonnen, Online-Bestelldienste anzubieten. Um ein Echtzeit-Online-Bestellsystem zu implementieren, können wir JavaScript und WebSocket-Technologie verwenden. WebSocket ist ein Vollduplex-Kommunikationsprotokoll, das auf dem TCP-Protokoll basiert und eine bidirektionale Kommunikation zwischen Client und Server in Echtzeit realisieren kann. Im Echtzeit-Online-Bestellsystem, wenn der Benutzer Gerichte auswählt und eine Bestellung aufgibt

Leistungsoptimierung von C++-Funktionsaufrufen: Auswirkungen der Parameterübergabe und Rückgabewerte Leistungsoptimierung von C++-Funktionsaufrufen: Auswirkungen der Parameterübergabe und Rückgabewerte May 04, 2024 pm 12:57 PM

Die Leistungsoptimierung von C++-Funktionsaufrufen umfasst zwei Aspekte: Parameterübergabestrategie und Optimierung des Rückgabewerttyps. In Bezug auf die Parameterübergabe eignet sich die Übergabe von Werten für kleine Objekte und nicht veränderbare Parameter, während die Übergabe von Referenzen oder Zeigern für große Objekte und veränderbare Parameter geeignet ist und die Übergabe von Zeigern am schnellsten ist. Im Hinblick auf die Optimierung des Rückgabewerts können kleine Werte direkt zurückgegeben werden, und große Objekte sollten Referenzen oder Zeiger zurückgeben. Durch die Wahl der geeigneten Strategie kann die Leistung von Funktionsaufrufen verbessert werden.

JavaScript und WebSocket: Aufbau eines effizienten Echtzeit-Wettervorhersagesystems JavaScript und WebSocket: Aufbau eines effizienten Echtzeit-Wettervorhersagesystems Dec 17, 2023 pm 05:13 PM

JavaScript und WebSocket: Aufbau eines effizienten Echtzeit-Wettervorhersagesystems Einführung: Heutzutage ist die Genauigkeit von Wettervorhersagen für das tägliche Leben und die Entscheidungsfindung von großer Bedeutung. Mit der Weiterentwicklung der Technologie können wir genauere und zuverlässigere Wettervorhersagen liefern, indem wir Wetterdaten in Echtzeit erhalten. In diesem Artikel erfahren Sie, wie Sie mit JavaScript und WebSocket-Technologie ein effizientes Echtzeit-Wettervorhersagesystem aufbauen. In diesem Artikel wird der Implementierungsprozess anhand spezifischer Codebeispiele demonstriert. Wir

Wie rufe ich Funktionen in verschiedenen Modulen in C++ auf? Wie rufe ich Funktionen in verschiedenen Modulen in C++ auf? Apr 12, 2024 pm 03:54 PM

Modulübergreifender Aufruf von Funktionen in C++: Funktion deklarieren: Deklarieren Sie die aufzurufende Funktion in der Header-Datei des Zielmoduls. Funktion implementieren: Implementieren Sie die Funktion in der Quelldatei. Verknüpfen von Modulen: Verwenden Sie einen Linker, um Module miteinander zu verknüpfen, die Funktionsdeklarationen und Implementierungen enthalten. Rufen Sie die Funktion auf: Fügen Sie die Header-Datei des Zielmoduls in das aufzurufende Modul ein und rufen Sie dann die Funktion auf.

Einfaches JavaScript-Tutorial: So erhalten Sie den HTTP-Statuscode Einfaches JavaScript-Tutorial: So erhalten Sie den HTTP-Statuscode Jan 05, 2024 pm 06:08 PM

JavaScript-Tutorial: So erhalten Sie HTTP-Statuscode. Es sind spezifische Codebeispiele erforderlich. Vorwort: Bei der Webentwicklung ist häufig die Dateninteraktion mit dem Server erforderlich. Bei der Kommunikation mit dem Server müssen wir häufig den zurückgegebenen HTTP-Statuscode abrufen, um festzustellen, ob der Vorgang erfolgreich ist, und die entsprechende Verarbeitung basierend auf verschiedenen Statuscodes durchführen. In diesem Artikel erfahren Sie, wie Sie mit JavaScript HTTP-Statuscodes abrufen und einige praktische Codebeispiele bereitstellen. Verwenden von XMLHttpRequest

C++-Funktionsaufrufreflexionstechnologie: Parameterübergabe und dynamischer Zugriff auf Rückgabewerte C++-Funktionsaufrufreflexionstechnologie: Parameterübergabe und dynamischer Zugriff auf Rückgabewerte May 05, 2024 am 09:48 AM

Die C++-Funktionsaufrufreflexionstechnologie ermöglicht das dynamische Abrufen von Funktionsparametern und Rückgabewertinformationen zur Laufzeit. Verwenden Sie die Ausdrücke typeid(decltype(...)) und decltype(...), um Parameter- und Rückgabewerttypinformationen abzurufen. Durch Reflexion können wir Funktionen dynamisch aufrufen und bestimmte Funktionen basierend auf der Laufzeiteingabe auswählen, was flexiblen und skalierbaren Code ermöglicht.

See all articles