Javascript 无法填充数组
嘿,我在draw函数中声明了drawOne函数,这样内部函数drawOne就可以访问局部变量checkduplicates。但是,在drawOne函数运行16次之后,数组checkduplicates应该填充对象,drawOne中的console.log显示数组中有16个对象,这一点得到了证实。但是,我用“Problem”标记的console.log函数显示数组只有第一个对象,而其他console.log则显示数组中充满了对象。我不明白为什么,因为修改数组的唯一方法是通过“push”方法,它已经被调用了16次,如果我注释掉img.onload部分,带有注释“problem”的console.log显示数组中充满了对象。为了简单起见,我故意省略了其他代码,我的firebug也没有抱怨bug。谢谢由于您使用的是异步递归,对Javascript 无法填充数组,javascript,canvas,Javascript,Canvas,嘿,我在draw函数中声明了drawOne函数,这样内部函数drawOne就可以访问局部变量checkduplicates。但是,在drawOne函数运行16次之后,数组checkduplicates应该填充对象,drawOne中的console.log显示数组中有16个对象,这一点得到了证实。但是,我用“Problem”标记的console.log函数显示数组只有第一个对象,而其他console.log则显示数组中充满了对象。我不明白为什么,因为修改数组的唯一方法是通过“push”方法,它已经
drawOne
的初始调用将在第一次迭代后返回。加载第一个图像后,以及退出draw
功能后,迭代将继续进行,以便浏览器重新获得控制权,从而可以处理事件
因此,在第一次迭代之后,数组只包含一个项目根本不是问题,这是您所使用的迭代方法的预期结果。Wait-i从何而来?还有“照片”?还有“检查副本”?您没有发布足够的代码。i已初始化为0;我会修好的。谢谢好的,但我仍然不明白为什么内部console.log显示数组已填充,而外部console.log显示数组仅包含一个对象。但它们不是同一个数组吗?应该只有一个与“checkduplicates”关联的内存地址?感谢you@Clinteney许:是同一个数组,但在不同的时间点。首先执行一次登录
drawOne
,显示一个的长度,然后执行登录Draw
,显示相同的结果。之后,将加载第一个图像并处理第一个onload
事件,登录drawOne
显示两个图像的长度。然后随着数组大小的增加,执行restonload
事件。在Draw
函数中,数组长度不可能不是1,因为只要您在函数中,就不会处理第一个onload
事件。非常感谢您的解释。
function draw(data)
{
var i = 0;
var checkduplicates = new Array();
drawOne(i);
//console.log(checkduplicates) Problem!!!;
function drawOne(i)
{
//photos is a object that has been omitted for simplicity
var picinfo = photos[Math.floor(Math.random()*photos.length)];
checkduplicates.push(picinfo);
img.onload = function()
{
var ctx = document.getElementsByClassName("canvas")[i].getContext('2d');
// Draw pieces
ctx.drawImage(img,0,0,132,150);
//ctx.fillText("haha",0,0);
ctx.drawImage(frame,0,0,133,152);
i++;
if (i != canvaslength)
{
drawOne(i);
}
}
//console.log(checkduplicates.length);
}
}