Ein Verschluss bezieht sich auf eine Funktion, die die Erlaubnis hat, in einem anderen Funktionsbereich auf Variablen zuzugreifen, aber der Konfigurationsmechanismus des Bereichs muss beachtet werden, dh ein Verschluss kann nur den letzten Wert erhalten, der Variablen in der Funktion enthält.
Wie in den folgenden Fällen:
Funktion create () {var arr = new Array (); für (var i = 0; i <10; i ++) {arr [i] = function () {return i;}; } return arr;} var c_arr = create (); für (var i = 0; i <c_arr.length; i ++) {document.write ("c_arr ["+i+"] ="+c_arr [i] ()+"<br />"); }Ausführungsergebnisse:
Auf der Oberfläche scheint es, dass der von jeder Funktion zurückgegebene I -Wert unterschiedlich ist, zum Beispiel sollte der Wert von c_arr [0] 0 sein, der Wert von c_arr [1] sollte 1 sein und so weiter. Jede Funktion kann durch Rückkehr 10 erhalten werden. Warum?
Da die Bereichskette jeder Funktion das aktive Objekt der Funktion create () speichert, beziehen sich alle auf dieselbe Variable i. Nach dem Ende der für die Schleife wird der Wert von I 10. Zu diesem Zeitpunkt bezieht sich jede Funktion auf das gleiche variable Objekt, das die Variable i hält.
Wir können den Verschluss erzwingen, sich wie erwartet zu verhalten, indem wir eine andere Domänenfunktion erstellen, so dass jede Position dem entsprechenden Wert entspricht.
Funktion create () {var arr = new Array (); für (var i = 0; i <10; i ++) {arr [i] = function (num) {return function () {return num; };}(ich); } return arr;} var c_arr = create (); für (var i = 0; i <c_arr.length; i ++) {document.write ("c_arr ["+i+"] ="+c_arr [i] ()+"<br />"); }Ausführungsergebnisse:
Definieren Sie eine anonyme Funktion und führen Sie die anonyme Funktion sofort aus, um sie dem Array zuzuweisen. Hier hat die anonyme Funktion eine Parameternummer, die der Wert ist, der durch die endgültige Funktion zurückgegeben wird. Wenn wir jede Funktion aufrufen, übergeben wir die Variable i. Da die Funktionsparameter mit einem Wert übergeben werden, wird der aktuelle Wert der Variablen I der Parameter Num zugewiesen. In dieser anonymen Funktion wird ein Verschluss zugreift, der auf NUM zugreift und zurückgegeben wird, sodass jede Funktion im Array eine Kopie ihrer eigenen Num -Variablen enthält, damit sie ihre eigenen verschiedenen numerischen Werte zurückgeben kann.
Klassische Beispiele
Schauen wir uns ein klassisches Beispiel an. Angenommen, die Seite hat eine Reihe von Schaltflächen -Tags. Wir verwenden Skripte, um das Klickenereignis an diesen Satz von Schaltflächen -Tags zu binden. Wenn Sie auf Klicken klicken, wird dies angezeigt, welches Tag dies ist.
<meta charset = "utf-8"/> <button> zuerst </button> <button> zweit </button> <tasten> dritte </button> <button> viertes </button> <script type = "text/javaScript"> var obj = document.GetElementsByTagn ('button'); function () {alert (i);}; } </script>Klicken Sie auf jede Schaltfläche, um zu ergeben
Auf der Oberfläche scheint es, dass das Klicken auf jedes Etikett verschiedene Zahlen aufgeben sollte
Der erste sollte 0 auftauchen;
Der zweite sollte 1 auftauchen;
Und so weiter.
Das Ergebnis ist jedoch, dass alle Tasten 4 auftauchen, was offensichtlich nicht das Ergebnis ist, das wir wollen.
Lassen Sie uns das Programm ändern
<meta charset = "utf-8"/> <button> Erst </button> <tasten> zweites </button> <butth> dritte </button> <button> viertes </button> <script type = "text/javaScript"> var obj = document.GetElementsByTagn ('Button'); for (var i = 0; function () {alert (num);}} (i); } </script>Klicken Sie auf die zweite
Klicken Sie auf den vierten
Wir müssen nur eine anonyme Funktion in der Funktion erstellen, die den oben genannten Fällen entspricht. Eine anonyme Funktion kann implementiert werden, um die externe Variable I zu erfassen, und der I -Wert jeder Taste Pop ist unterschiedlich.