Heim Web-Frontend js-Tutorial Eine eingehende Analyse des Schließmechanismus von JavaScript_Grundkenntnisse

Eine eingehende Analyse des Schließmechanismus von JavaScript_Grundkenntnisse

May 16, 2016 pm 03:35 PM
javascript 闭包

JavaScript-Variablen können lokale Variablen oder globale Variablen sein.
Abschlüsse können für private Variablen verwendet werden.
Globale Variablen
Funktionen können auf Variablen zugreifen, die innerhalb der Funktion definiert sind, wie zum Beispiel:
Beispiel

function myFunction() {
  var a = 4;
  return a * a;
}
Nach dem Login kopieren


Funktionen können auch auf Variablen zugreifen, die außerhalb der Funktion definiert sind, wie zum Beispiel:
Beispiel

var a = 4;
function myFunction() {
  return a * a;
}
Nach dem Login kopieren

Im letzteren Beispiel ist a eine globale Variable.
Globale Variablen in Webseiten gehören zum Fensterobjekt.
Globale Variablen gelten für alle Skripte auf der Seite.
Im ersten Fall ist a eine lokale Variable.
Lokale Variablen können nur innerhalb der Funktion verwendet werden, in der sie definiert sind. Nicht verfügbar für andere Funktionen oder Skriptcode.
Auch wenn globale und lokale Variablen denselben Namen haben, handelt es sich um zwei verschiedene Variablen. Die Änderung eines davon hat keinen Einfluss auf den Wert des anderen.
Hinweis
Wenn eine Variable ohne das Schlüsselwort var deklariert wird, handelt es sich um eine globale Variable, auch wenn sie innerhalb einer Funktion definiert ist.

Variabler Lebenszyklus
Der Geltungsbereich globaler Variablen ist global, dh globale Variablen befinden sich überall im gesamten JavaScript-Programm.
Innerhalb einer Funktion deklarierte Variablen funktionieren nur innerhalb der Funktion. Diese Variablen sind lokale Variablen und ihr Gültigkeitsbereich ist lokal; die Parameter der Funktion sind ebenfalls lokal und funktionieren nur innerhalb der Funktion.
Gegendilemma
Stellen Sie sich vor, Sie möchten einige Werte zählen und der Zähler ist in allen Funktionen verfügbar.
Sie können globale Variablen und Funktionen verwenden, um den Zähler so einzustellen, dass er erhöht wird:
Beispiel

var counter = 0;

function add() {
  counter += 1;
}

add();
add();
add();

// 计数器现在为 3

Nach dem Login kopieren

Der Zählerwert ändert sich, wenn die Funktion add() ausgeführt wird.
Aber hier liegt das Problem: Jedes Skript auf der Seite kann den Zähler ändern, auch wenn die Funktion add() nicht aufgerufen wird.
Wenn ich einen Zähler innerhalb einer Funktion deklariere, kann der Wert des Zählers nicht geändert werden, ohne die Funktion aufzurufen:
Beispiel

function add() {
  var counter = 0;
  counter += 1;
}

add();
add();
add();

// 本意是想输出 3, 但事与愿违,输出的都是 1 !

Nach dem Login kopieren

Der obige Code wird nicht korrekt ausgegeben. Jedes Mal, wenn ich die Funktion add() aufrufe, wird der Zähler auf 1 gesetzt.
JavaScript-Inline-Funktionen können dieses Problem lösen.
In JavaScript integrierte Funktionen
Alle Funktionen haben Zugriff auf globale Variablen.
Tatsächlich haben in JavaScript alle Funktionen Zugriff auf den darüber liegenden Bereich.
JavaScript unterstützt verschachtelte Funktionen. Verschachtelte Funktionen können auf Funktionsvariablen der oberen Ebene zugreifen.
In diesem Beispiel kann die Inline-Funktion plus() auf die Zählervariable der übergeordneten Funktion zugreifen:
Beispiel

function add() {
  var counter = 0;
  function plus() {counter += 1;}
  plus();  
  return counter; 
}
Nach dem Login kopieren

Wenn wir extern auf die Funktion plus() zugreifen könnten, würde dies das Zählerdilemma lösen.
Wir müssen auch sicherstellen, dass counter = 0 nur einmal ausgeführt wird.
Wir brauchen Schließungen.
JavaScript-Schließung
Erinnern Sie sich an die Funktion, die sich selbst aufruft? Was macht diese Funktion?
Beispiel

var add = (function () {
  var counter = 0;
  return function () {return counter += 1;}
})();

add();
add();
add();

// 计数器为 3

Nach dem Login kopieren

Beispielanalyse
Die Variable add gibt den Rückgabewortwert der aufrufenden Funktion selbst an.
Selbstaufrufende Funktionen werden nur einmal ausgeführt. Zähler auf 0 setzen. und gibt den Funktionsausdruck zurück.
Die Add-Variable kann als Funktion verwendet werden. Das Coole daran ist, dass es den Zugriff auf Zähler aus dem Bereich über der Funktion ermöglicht.
Dies wird als JavaScript-Abschluss bezeichnet. Es ermöglicht Funktionen, private Variablen zu haben.
Der Zähler ist durch den Bereich der anonymen Funktion geschützt und kann nur über die Add-Methode geändert werden.

Hinweis
Ein Abschluss ist eine Funktion, die auf Variablen im Gültigkeitsbereich der vorherigen Funktion zugreifen kann, auch wenn die vorherige Funktion geschlossen wurde.

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

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

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)

Was bedeutet der Abschluss im C++-Lambda-Ausdruck? Was bedeutet der Abschluss im C++-Lambda-Ausdruck? Apr 17, 2024 pm 06:15 PM

In C++ ist ein Abschluss ein Lambda-Ausdruck, der auf externe Variablen zugreifen kann. Um einen Abschluss zu erstellen, erfassen Sie die äußere Variable im Lambda-Ausdruck. Abschlüsse bieten Vorteile wie Wiederverwendbarkeit, Ausblenden von Informationen und verzögerte Auswertung. Sie sind in realen Situationen nützlich, beispielsweise bei Ereignishandlern, bei denen der Abschluss auch dann noch auf die äußeren Variablen zugreifen kann, wenn diese zerstört werden.

Wie implementiert man einen Abschluss im C++-Lambda-Ausdruck? Wie implementiert man einen Abschluss im C++-Lambda-Ausdruck? Jun 01, 2024 pm 05:50 PM

C++-Lambda-Ausdrücke unterstützen Abschlüsse, die Funktionsbereichsvariablen speichern und sie für Funktionen zugänglich machen. Die Syntax lautet [capture-list](parameters)->return-type{function-body}. Capture-Liste definiert die zu erfassenden Variablen. Sie können [=] verwenden, um alle lokalen Variablen nach Wert zu erfassen, [&], um alle lokalen Variablen nach Referenz zu erfassen, oder [Variable1, Variable2,...], um bestimmte Variablen zu erfassen. Lambda-Ausdrücke können nur auf erfasste Variablen zugreifen, den ursprünglichen Wert jedoch nicht ändern.

Was sind die Vor- und Nachteile von Abschlüssen in C++-Funktionen? Was sind die Vor- und Nachteile von Abschlüssen in C++-Funktionen? Apr 25, 2024 pm 01:33 PM

Ein Abschluss ist eine verschachtelte Funktion, die auf Variablen im Bereich der äußeren Funktion zugreifen kann. Zu ihren Vorteilen gehören Datenkapselung, Zustandserhaltung und Flexibilität. Zu den Nachteilen gehören der Speicherverbrauch, die Auswirkungen auf die Leistung und die Komplexität des Debuggens. Darüber hinaus können Abschlüsse anonyme Funktionen erstellen und diese als Rückrufe oder Argumente an andere Funktionen übergeben.

Lösen Sie das durch Schließungen verursachte Speicherverlustproblem Lösen Sie das durch Schließungen verursachte Speicherverlustproblem Feb 18, 2024 pm 03:20 PM

Titel: Durch Abschlüsse und Lösungen verursachte Speicherlecks Einführung: Abschlüsse sind ein sehr verbreitetes Konzept in JavaScript, das internen Funktionen den Zugriff auf Variablen externer Funktionen ermöglicht. Allerdings können Schließungen bei falscher Verwendung zu Speicherverlusten führen. In diesem Artikel wird das durch Schließungen verursachte Speicherverlustproblem untersucht und Lösungen sowie spezifische Codebeispiele bereitgestellt. 1. Durch Schließungen verursachte Speicherlecks Das Merkmal von Schließungen besteht darin, dass interne Funktionen auf Variablen externer Funktionen zugreifen können, was bedeutet, dass in Schließungen referenzierte Variablen nicht durch Müll gesammelt werden. Bei unsachgemäßer Verwendung

Verkettete Aufrufe und Schließungen von PHP-Funktionen Verkettete Aufrufe und Schließungen von PHP-Funktionen Apr 13, 2024 am 11:18 AM

Ja, die Einfachheit und Lesbarkeit des Codes können durch verkettete Aufrufe und Abschlüsse optimiert werden: Verkettete Aufrufe verknüpfen Funktionsaufrufe in einer fließenden Schnittstelle. Abschlüsse erstellen wiederverwendbare Codeblöcke und greifen auf Variablen außerhalb von Funktionen zu.

Die Rolle des Golang-Funktionsschlusses beim Testen Die Rolle des Golang-Funktionsschlusses beim Testen Apr 24, 2024 am 08:54 AM

Funktionsabschlüsse der Go-Sprache spielen beim Unit-Testen eine wichtige Rolle: Werte erfassen: Abschlüsse können auf Variablen im äußeren Bereich zugreifen, sodass Testparameter erfasst und in verschachtelten Funktionen wiederverwendet werden können. Vereinfachen Sie den Testcode: Durch die Erfassung von Werten vereinfachen Abschlüsse den Testcode, indem sie die Notwendigkeit beseitigen, Parameter für jede Schleife wiederholt festzulegen. Verbessern Sie die Lesbarkeit: Verwenden Sie Abschlüsse, um die Testlogik zu organisieren und so den Testcode klarer und leichter lesbar zu machen.

Der Einfluss von Funktionszeigern und -abschlüssen auf die Golang-Leistung Der Einfluss von Funktionszeigern und -abschlüssen auf die Golang-Leistung Apr 15, 2024 am 10:36 AM

Die Auswirkungen von Funktionszeigern und -abschlüssen auf die Go-Leistung sind wie folgt: Funktionszeiger: Etwas langsamer als direkte Aufrufe, aber verbessert die Lesbarkeit und Wiederverwendbarkeit. Schließungen: Normalerweise langsamer, kapseln aber Daten und Verhalten. Praktischer Fall: Funktionszeiger können Sortieralgorithmen optimieren und Abschlüsse können Ereignishandler erstellen, aber sie bringen Leistungseinbußen mit sich.

Wie werden Schließungen in Java implementiert? Wie werden Schließungen in Java implementiert? May 03, 2024 pm 12:48 PM

Abschlüsse in Java ermöglichen es inneren Funktionen, auf äußere Bereichsvariablen zuzugreifen, selbst wenn die äußere Funktion beendet wurde. Durch anonyme innere Klassen implementiert, enthält die innere Klasse einen Verweis auf die äußere Klasse und hält die äußeren Variablen aktiv. Schließungen erhöhen die Codeflexibilität, Sie müssen sich jedoch des Risikos von Speicherverlusten bewusst sein, da Verweise auf externe Variablen durch anonyme innere Klassen diese Variablen am Leben halten.

See all articles