Erstellen von Event-Handlern mit Abschluss in Javascript
In der Javascript-Programmierung ist es üblich, Event-Handler innerhalb von Schleifen zu erstellen. Bei der Verwendung einer Syntax wie „select.onchange = function()“ ist es jedoch wichtig, sich des potenziellen Problems mit gemeinsamen Referenzen bewusst zu sein.
Wenn ein Event-Handler innerhalb einer Schleife mit dieser Syntax zugewiesen wird, kann dies zu Problemen führen an alle Event-Handler, die auf dieselben Variablen verweisen, die die in der Schleife zugewiesenen Endwerte enthalten. Dies kann dazu führen, dass für alle Ereignisse dieselben Parameter an den Ereignishandler übergeben werden, unabhängig von der einzelnen Iteration.
Um dieses Problem zu beheben und Referenzen auf gemeinsam genutzte Variablen zu verhindern, ist ein Abschluss erforderlich. Bei einem Abschluss wird eine innere Funktion erstellt, die die Variablen der äußeren Funktion per Referenz erfasst. Diese innere Funktion kann dann als Event-Handler verwendet werden, um sicherzustellen, dass jeder Event-Handler über eine eigene Kopie der Variablen aus der entsprechenden Schleifeniteration verfügt.
Für das gegebene Beispiel in der Frage zeigt der folgende Code, wie das geht Implementieren Sie einen Abschluss und übergeben Sie die richtigen Parameter an den Event-Handler:
<code class="javascript">var blah = xmlres.getElementsByTagName('blah'); for(var i = 0; i < blah.length; i++) { var td = document.createElement('td'); var select = document.createElement('select'); select.setAttribute("...", "..."); select.onchange = function(s,c,a) { return function() { onStatusChanged(s,c,a); } }(select, callid, anotherid); td.appendChild(select); }</code>
In diesem Code gibt die innere, anonyme Funktion die Funktion zurück, die als Event-Handler verwendet wird. Die (s,c,a)-Parameter innerhalb der Funktion werden per Referenz erfasst, wodurch sichergestellt wird, dass jeder Event-Handler über seinen eigenen, eindeutigen Satz von Variablen verfügt. Dadurch werden beim Eintreten eines Ereignisses die richtigen Parameter an die onStatusChanged-Methode übergeben.
Das obige ist der detaillierte Inhalt vonWie können Abschlüsse dazu beitragen, gemeinsame Referenzen beim Erstellen von Ereignishandlern in JavaScript-Schleifen zu vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!