Was ist ein Abschluss in Javascript?
Wenn in JavaScript zwei Funktionen ineinander verschachtelt sind, ist die innere Funktion ein Abschluss. Ein Abschluss ist eine Funktion, die Zugriff auf Variablen im Gültigkeitsbereich einer anderen Funktion hat. Die häufigste Methode zum Erstellen eines Abschlusses besteht darin, eine andere Funktion innerhalb einer Funktion zu erstellen und über die andere Funktion auf die lokalen Variablen dieser Funktion zuzugreifen.
Die Betriebsumgebung dieses Tutorials: Windows 7-System, JavaScript-Version 1.8.5, Dell G3-Computer.
1. Was ist ein Abschluss?
Ein Abschluss ist eine Funktion, die die internen Variablen anderer Funktionen lesen kann. In JavaScript können nur Unterfunktionen innerhalb einer Funktion lokale Variablen lesen, sodass Abschlüsse als „innerhalb einer Funktion definierte Funktionen“ verstanden werden können. Im Wesentlichen sind Abschlüsse die Brücke zwischen dem Inneren einer Funktion und dem Äußeren der Funktion. (Die typischste Anwendung von Abschlüssen ist die Implementierung von Rückruffunktionen.)
2. Vorteile, Nachteile und Eigenschaften von Abschlüssen in JS
Vorteile:
1. Schützen Sie die Sicherheit von Variablen innerhalb der Funktion
2. Behalten Sie eine Variable im Speicher bei (sie ändert sich, wenn sie verwendet wird). zu viel) 3. Logische Kontinuität. Wenn der Abschluss als Parameter eines anderen Funktionsaufrufs verwendet wird, verhindert er, dass Sie sich von der aktuellen Logik lösen und zusätzliche Logik separat schreiben.
4. Lokale Variablen, die den Aufrufkontext erleichtern.
5. Durch eine Stärkung der Kapselung kann der Schutz von Variablen erreicht werden.
Nachteile: 1. Residenter Speicher erhöht die Speichernutzung und eine unsachgemäße Verwendung kann leicht zu Speicherverlusten führen.
2. Es gibt auch ein sehr ernstes Problem, nämlich das Problem der Speicherverschwendung. Diese Speicherverschwendung liegt nicht nur daran, dass sie sich im Speicher befindet, sondern, was noch wichtiger ist, die unsachgemäße Verwendung von Schließungen führt zur Erzeugung ungültigen Speichers.Eigenschaften: 1. Funktionsverschachtelte Funktionen
2. Interne Funktionen können auf Variablen externer Funktionen zugreifen
3. Parameter und Variablen werden nicht recycelt.
3. Variabler GeltungsbereichUm den Abschluss zu verstehen, reicht es nicht aus, nur das oben genannte Konzept des Abschlusses zu verstehen. Zunächst müssen Sie den speziellen Variablenbereich von JavaScript verstehen.
1. Es gibt nur zwei Bereiche von Variablen: globale Variablen und lokale Variablen.
2. Das Besondere an der JavaScript-Sprache ist, dass globale Variablen direkt innerhalb der Funktion gelesen werden können, lokale Variablen innerhalb der Funktion jedoch nicht außerhalb der Funktion.
3. Hinweis: Verwenden Sie beim Deklarieren von Variablen innerhalb einer Funktion unbedingt den Befehl var. Wenn Sie es nicht verwenden, deklarieren Sie tatsächlich eine globale Variable!
4. Verschlüsse mit Code interpretierenDer Erstellungsprozess von Verschlüssen in Javascript ist wie im folgenden Programm dargestellt.
function a () { var i = 0; function b () { alert (i++); } return b; } var c = a(); c(); //函数调用
CodefunktionenDieser Code hat zwei Funktionen:
1. Funktion b ist in Funktion a verschachtelt;
2. Funktion a gibt Funktion b zurück.
Auf diese Weise zeigt die Variable c nach der Ausführung von var c = a() tatsächlich auf die Funktion b. Nach der erneuten Ausführung von c() wird ein Fenster angezeigt, in dem der Wert von i angezeigt wird (das erste Mal ist 1). Dieser Code erstellt tatsächlich einen Abschluss, da die Variable c außerhalb der Funktion a auf die Funktion b innerhalb der Funktion a verweist. Mit anderen Worten: Wenn die Funktion b innerhalb der Funktion a von einer Variablen außerhalb der Funktion a referenziert wird, wird ein Abschluss erstellt.
FunktionKurz gesagt besteht die Funktion des Abschlusses darin, dass der Abschluss nach der Ausführung und Rückgabe von a verhindert, dass der Garbage-Collection-Mechanismus von Javascript die von a belegten Ressourcen zurückfordert, da die interne Funktion b von a Die Ausführung von hängt von den Variablen in a ab.
Im obigen Beispiel existiert i in a immer, nachdem die Funktion a zurückgegeben wird. Auf diese Weise ist i jedes Mal, wenn c() ausgeführt wird, der Wert von i, der nach dem Hinzufügen von 1 gemeldet wird .
Dann stellen wir uns eine andere Situation vor. Wenn a etwas anderes als Funktion b zurückgibt, ist die Situation völlig anders. Denn nach der Ausführung von a wird b nicht an die Außenwelt von a zurückgegeben, sondern nur von a referenziert. Daher verweisen die Funktionen a und b aufeinander, werden aber nicht gestört von der Außenwelt (von der Außenwelt referenziert), werden die Funktionen a und b recycelt.
Anwendungsszenarien 1. Schützen Sie die Variablen innerhalb der Funktion. In Funktion a kann nur über Funktion b auf i zugegriffen werden, auf andere Weise kann nicht zugegriffen werden, wodurch die Sicherheit von i geschützt wird.
2. Behalten Sie eine Variable im Speicher bei. Aufgrund der Schließung ist i in der Funktion a immer im Speicher vorhanden, sodass i jedes Mal, wenn c() ausgeführt wird, um 1 erhöht wird.
五、如何从外部读取函数内部的局部变量?
出于种种原因,我们有时候需要获取到函数内部的局部变量。但是,上面(三、变量作用域)已经说过了,正常情况下,这是办不到的!只有通过变通的方法才能实现。那就是在函数内部,再定义一个函数。
function demo1 () { var n = 6699; function demo2 () { alert(n); // 6699 } }
在上面的代码中,函数 demo2 就被包括在函数demo1内部,这时demo1内部的所有局部变量,对demo2都是可见的。但是反过来就不行,demo2内部的局部变量,对demo1就是不可见的。
这就是Javascript语言特有的”链式作用域”结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。
既然demo2可以读取demo1中的局部变量,那么只要把demo2作为返回值,我们不就可以在demo1外部读取它的内部变量了吗!
六、闭包的用途
闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中,不会在demo1调用后被自动清除。
那为什么会这样呢?原因就在于demo1是demo2的父函数,而demo2被赋给了一个全局变量,这导致demo2始终在内存中,而demo2的存在依赖于demo1,因此demo1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。
七、使用闭包的注意点
1、由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2、闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
八、总结:
1、闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量。闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。
2、不适合场景:返回闭包的函数是个非常大的函数。
闭包的典型框架应该就是jquery了。
闭包是javascript语言的一大特点,主要应用闭包场合主要是为了:设计私有的方法和变量。
这在做框架的时候体现更明显,有些方法和属性只是运算逻辑过程中的使用的,不想让外部修改这些属性,因此就可以设计一个闭包来只提供方法获取。
3、 不必纠结到底怎样才算闭包,其实你写的每一个函数都算作闭包,即使是全局函数,你访问函数外部的全局变量时,就是闭包
的体现。
更多编程相关知识,请访问:编程入门!!
Das obige ist der detaillierte Inhalt vonWas ist ein Abschluss in Javascript?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



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.

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.

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.

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

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.

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.

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.

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.
