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

WBOY
Freigeben: 2016-05-16 15:02:20
Original
1352 Leute haben es durchsucht

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.

Verwandte Etiketten:
Quelle:php.cn
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage