Javascript:将自定义对象方法绑定到事件侦听器

Javascript:将自定义对象方法绑定到事件侦听器,javascript,Javascript,我被Javascript的事件处理程序方面所困扰 rowCells[j]是对唯一对象的引用。 galleryCell也是对新创建对象的引用。毫无疑问,这两者可以联系在一起 但是,这两个引用似乎根本没有绑定在一起,事件侦听器就无法正常工作。所有单元格都被指定给相同的对象(最后一个galleryCell对象) galleryCell变量位于for循环中,用于在每次迭代中获取新引用。为什么这些参考资料会丢失 function TypeGallery (galleryObj) { //receives

我被Javascript的事件处理程序方面所困扰

rowCells[j]是对唯一对象的引用。 galleryCell也是对新创建对象的引用。毫无疑问,这两者可以联系在一起

但是,这两个引用似乎根本没有绑定在一起,事件侦听器就无法正常工作。所有单元格都被指定给相同的对象(最后一个galleryCell对象)

galleryCell变量位于for循环中,用于在每次迭代中获取新引用。为什么这些参考资料会丢失

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();
}
功能类型库(galleryObj)
{//接收包含库的行和单元格的元素
//性质--------------
var GalleryCellar=[];//galleryZoomCell对象数组
//方法------------------
变量初始化=函数()
{
变量行=galleryObj.children;
var rowCount=rows.length;

for(var i=0;i尝试将javascript闭包放入for循环中,如下所示:

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++)
         {
            (function(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();};

            })(j);
         }
      }
   }

   //Initialization
   Initialize();
}
功能类型库(galleryObj)
{//接收包含库的行和单元格的元素
//性质--------------
var GalleryCellar=[];//galleryZoomCell对象数组
//方法------------------
变量初始化=函数()
{
变量行=galleryObj.children;
var rowCount=rows.length;

对于(var i=0;iok),我现在了解了Javascript和块范围限制的问题

在此过程中,我发现了第二个可能的修复方法:
将“var”替换为“let”inside for循环是否有任何异议或警告?
据我所知,这段代码运行良好。有任何隐患吗

   var Initialize  = function ()
   {
      var rowsArr  = galleryObj.children;
      var rowCount = rowsArr.length;
      for (let i=0;i<rowCount;i++)
      {  //Javascript does not understand block-scope unless the let keyword
         let rowCellsArr  = rowsArr[i].children;
         let rowCellCount = rowCellsArr.length;
         for (let j=0;j<rowCellCount;j++) 
         {
            //Attach (rowCellsArr[j]);

            let sliderObj   = new TypeSlider(300,1,false);
            let galleryCell = new TypeGalleryZoomCell(rowCellsArr[j],sliderObj);
            galleryCellArr.push(galleryCell); 

            galleryCellArr[galleryCellArr.length-1].cell.onmousedown = function () {galleryCell.Deploy();};
            galleryCellArr[galleryCellArr.length-1].cell.onmouseup   = function () {galleryCell.Retract();};

         }
      }
   }
var Initialize=函数()
{
var rowsArr=galleryObj.儿童;
var rowCount=rowsArr.length;

对于(设i=0;galleryCell变量的作用域不是for块,而是整个Initialize函数。因此,每次迭代都会完全重写它,因此当事件触发时,调用的函数只是galleryCell的最新赋值。请看“是”,但请注意,创建在循环外调用一个函数,然后在循环内调用它,而不是在每次迭代时生成一个新的匿名函数。哇,是的,这很有效。谢谢你的回答!现在我需要回去找出为什么我在理解Javascript作用域时会有这个盲点。