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