Heim Web-Frontend js-Tutorial Verstehen Sie den js-Abschluss in einer Minute_Javascript-Kenntnisse

Verstehen Sie den js-Abschluss in einer Minute_Javascript-Kenntnisse

May 16, 2016 pm 03:02 PM
js 闭包

Was ist eine Schließung?
Schauen Sie sich zuerst einen Code an:

function a(){
  var n = 0;
  function inc() {
    n++;
    console.log(n);
  }
  inc(); 
  inc(); 
}
a(); //控制台输出1,再输出2
Nach dem Login kopieren

Halten Sie es einfach. Schauen wir uns noch einmal einen Code an:

function a(){
  var n = 0;
  this.inc = function () {
    n++; 
    console.log(n);
  };
}
var c = new a();
c.inc();  //控制台输出1
c.inc();  //控制台输出2
Nach dem Login kopieren

Halten Sie es einfach.

Was ist eine Schließung? Das ist Schluss!

Funktionen, die Zugriff auf Variablen im Gültigkeitsbereich einer anderen Funktion haben, sind Abschlüsse. Hier greift die Funktion inc auf die Variable n im Konstruktor a zu, sodass ein Abschluss gebildet wird.

Schauen Sie sich noch einmal einen Code an:

function a(){
  var n = 0;
  function inc(){
    n++; 
    console.log(n);
  }
  return inc;
}
var c = a();
c();  //控制台输出1
c();  //控制台输出2
Nach dem Login kopieren

Sehen Sie, wie es funktioniert:

var c = couter(), dieser Satz couter() gibt die Funktion inc zurück, dann entspricht dieser Satz var c = inc;

c(), dieser Satz entspricht inc(); Beachten Sie, dass der Funktionsname nur ein Bezeichner (Zeiger auf die Funktion) ist und () der ist Ausführungsfunktion.

Die Übersetzung der nächsten drei Sätze lautet: var c = inc();, unterscheidet sie sich vom ersten Code? NEIN.

Was ist eine Schließung? Das ist Schluss!

Alle Lehrbuch-Tutorials verwenden gerne den letzten Absatz, um Abschlüsse zu erklären, aber ich denke, das verkompliziert das Problem. Was hier zurückgegeben wird, ist der Funktionsname. Schüler, die die C/C++-Programmierung von Tan Haoqiang nicht gesehen haben, erkennen möglicherweise nicht sofort den Unterschied zwischen der Verwendung von () und nicht. Mit anderen Worten, diese Schreibmethode hat ihre eigene Falle. Obwohl diese Schreibweise eleganter ist, möchte ich das Problem dennoch vereinfachen. Schauen Sie sich Code 1 und Code 2 an. Sind Sie immer noch verwirrt über den Funktionsaufruf?

Warum schreibst du das so?
Wir wissen, dass jede Funktion von js ein kleiner dunkler Raum ist. Sie kann Informationen von der Außenwelt erhalten, aber die Außenwelt kann den Inhalt im Inneren nicht direkt sehen. Platzieren Sie die Variable n in einem kleinen schwarzen Raum. Es gibt keine andere Möglichkeit, auf die Variable n mit demselben Namen außerhalb der Funktion a zuzugreifen. Dies ist die sogenannte erweiterte „Kapselung“.

Der Grund, warum return verwendet wird, um den Funktionsbezeichner inc zurückzugeben, liegt darin, dass die inc-Funktion nicht direkt außerhalb der a-Funktion aufgerufen werden kann, sodass return inc mit der Außenseite verknüpft ist. Dies in Code 2 verknüpft auch inc mit der Außenseite.

Häufige Fallen
Sehen Sie sich das an:

function createFunctions(){
  var result = new Array();
  for (var i=0; i < 10; i++){
    result[i] = function(){
      return i;
    };
  }
  return result;
}
var funcs = createFunctions();
for (var i=0; i < funcs.length; i++){
  console.log(funcs[i]());
}
Nach dem Login kopieren

Auf den ersten Blick dachte ich, es würde 0 bis 9 ausgeben, aber ich hätte nie gedacht, dass es 10 10s ausgeben würde?

Die Falle hier ist: Funktion mit () ist die Ausführungsfunktion! Ein einfacher Satz wie var f = function() { Alert('Hi'); wird das Fenster nur dann öffnen, wenn der Code in der Funktion folgt hingerichtet. Die Übersetzung des obigen Codes lautet:

var result = new Array(), i;
result[0] = function(){ return i; }; //没执行函数,函数内部不变,不能将函数内的i替换!
result[1] = function(){ return i; }; //没执行函数,函数内部不变,不能将函数内的i替换!
...
result[9] = function(){ return i; }; //没执行函数,函数内部不变,不能将函数内的i替换!
i = 10;
funcs = result;
result = null;

console.log(i); // funcs[0]()就是执行 return i 语句,就是返回10
console.log(i); // funcs[1]()就是执行 return i 语句,就是返回10
...
console.log(i); // funcs[9]()就是执行 return i 语句,就是返回10

Nach dem Login kopieren

Warum werden nur die Ergebnisse erfasst, ich aber nicht? Weil ich immer noch durch die Funktion referenziert werde. Genau wie in einem Restaurant sind die Teller immer begrenzt, also patrouilliert der Kellner am Tisch, um die leeren Teller einzusammeln, aber wie kann er es wagen, die Teller einzusammeln, auf denen noch Gemüse ist? Wenn Sie das Geschirr auf dem Teller manuell leeren (=null), wird der Teller natürlich mitgenommen. Dies ist der sogenannte Memory-Recycling-Mechanismus.

Was die Frage angeht, wie der Wert von i noch erhalten werden kann, sollte es tatsächlich keinen Grund zur Sorge geben, nachdem man den Artikel von Anfang an gelesen hat. Sollte nach dem Verzehr eines Stücks nicht ein Stück vom Essen auf dem Teller fehlen?

Zusammenfassend
Der Abschluss ist eine Funktion, die auf eine Variable einer anderen Funktion verweist. Da auf die Variable verwiesen wird, wird sie nicht recycelt und kann daher zum Kapseln einer privaten Variablen verwendet werden. Dies ist sowohl ein Vorteil als auch ein Nachteil. Unnötige Schließungen erhöhen nur den Speicherverbrauch! Darüber hinaus sollten Sie bei der Verwendung von Abschlüssen auch darauf achten, ob der Wert der Variablen Ihren Anforderungen entspricht, da es sich um eine statische private Variable handelt. Abschlüsse werden normalerweise mit vielen Dingen verwechselt. Nur wenn Sie sich mit ihnen auseinandersetzen, können Sie Ihr Verständnis vertiefen. Dies ist nur der Anfang, um über die grundlegenden Dinge zu sprechen.

Link zu diesem Artikel: http://www.cnblogs.com/qieguo/p/5457040.html

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein.

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

Repo: Wie man Teamkollegen wiederbelebt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
1 Monate 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)

Empfohlen: Ausgezeichnetes JS-Open-Source-Projekt zur Gesichtserkennung und -erkennung Empfohlen: Ausgezeichnetes JS-Open-Source-Projekt zur Gesichtserkennung und -erkennung Apr 03, 2024 am 11:55 AM

Die Technologie zur Gesichtserkennung und -erkennung ist bereits eine relativ ausgereifte und weit verbreitete Technologie. Derzeit ist JS die am weitesten verbreitete Internetanwendungssprache. Die Implementierung der Gesichtserkennung und -erkennung im Web-Frontend hat im Vergleich zur Back-End-Gesichtserkennung Vor- und Nachteile. Zu den Vorteilen gehören die Reduzierung der Netzwerkinteraktion und die Echtzeiterkennung, was die Wartezeit des Benutzers erheblich verkürzt und das Benutzererlebnis verbessert. Die Nachteile sind: Es ist durch die Größe des Modells begrenzt und auch die Genauigkeit ist begrenzt. Wie implementiert man mit js die Gesichtserkennung im Web? Um die Gesichtserkennung im Web zu implementieren, müssen Sie mit verwandten Programmiersprachen und -technologien wie JavaScript, HTML, CSS, WebRTC usw. vertraut sein. Gleichzeitig müssen Sie auch relevante Technologien für Computer Vision und künstliche Intelligenz beherrschen. Dies ist aufgrund des Designs der Webseite erwähnenswert

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

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.

Die Beziehung zwischen js und vue Die Beziehung zwischen js und vue Mar 11, 2024 pm 05:21 PM

Die Beziehung zwischen js und vue: 1. JS als Eckpfeiler der Webentwicklung; 2. Der Aufstieg von Vue.js als Front-End-Framework; 3. Die komplementäre Beziehung zwischen JS und Vue; Vue.

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