Ich bin auf den Event-Handler-Aspekt von Javascript fest.Javascript: Binden einer benutzerdefinierten Objektmethode an einen Ereignis-Listener
rowCells [j] ist eine Referenz auf ein eindeutiges Objekt. galleryCell ist auch eine Referenz auf neu erstellte Objekte. Es liegt nahe, dass die beiden sich verbinden könnten.
Es scheint jedoch, dass die beiden Referenzen überhaupt nicht miteinander verbunden sind, damit der Ereignis-Listener ordnungsgemäß funktioniert. Alle Zellen werden demselben Objekt zugewiesen (dem letzten galleryCell-Objekt).
Die Variable galleryCell befindet sich in einer for-Schleife, die bei jeder Iteration eine neue Referenz erhält. Warum sind diese Referenzen verloren?
function TypeGallery (galleryObj)
{ //receives the <div> element that contains rows and cells of a gallery
//Properties --------------
var galleryCellArr = []; //array of galleryZoomCell objects
//Methods -----------------
var Initialize = function()
{
var rows = galleryObj.children;
var rowCount = rows.length;
for (var i=0;i<rowCount;i++)
{
var rowCells = rows[i].children;
var rowCellCount = rowCells.length;
for (var j=0;j<rowCellCount;j++)
{
var sliderObj = new TypeSlider(300,1,false);
var galleryCell = new TypeGalleryZoomCell(rowCells[j],sliderObj)
galleryCellArr.push(galleryCell);
rowCells[j].onmousedown = function() {galleryCell.Deploy();};
rowCells[j].onmouseup = function() {galleryCell.Retract();};
}
}
}
//Initialization
Initialize();
}
Die Variable galleryCell ist nicht auf den for-Block beschränkt, sondern auf die gesamte Initialize-Funktion. Es wird daher bei jeder Iteration komplett neu geschrieben, und wenn das Ereignis ausgelöst wird, ist die aufgerufene Funktion nur die letzte Zuweisung für galleryCell. Werfen Sie einen Blick auf http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example – TAGraves