Javascript 与array.push()相比,如何使预初始化的数组内容起作用?

Javascript 与array.push()相比,如何使预初始化的数组内容起作用?,javascript,Javascript,为什么不能在如图所示的数组中定义图像。 为什么每次都需要在数组中推送一个新的图像对象 var canvas = null; var ctx = null; var assets = [ '/media/img/gamedev/robowalk/robowalk00.png', '/media/img/gamedev/robowalk/robowalk01.png', '/media/img/gamedev/robowalk/robowalk02.png',

为什么不能在如图所示的数组中定义图像。 为什么每次都需要在数组中推送一个新的图像对象

var canvas = null; 
var ctx = null; 
var assets = [
    '/media/img/gamedev/robowalk/robowalk00.png', 
    '/media/img/gamedev/robowalk/robowalk01.png', 
    '/media/img/gamedev/robowalk/robowalk02.png', 
    '/media/img/gamedev/robowalk/robowalk03.png', 
    '/media/img/gamedev/robowalk/robowalk04.png', 
    '/media/img/gamedev/robowalk/robowalk05.png', 
    '/media/img/gamedev/robowalk/robowalk06.png', 
    '/media/img/gamedev/robowalk/robowalk07.png', 
    '/media/img/gamedev/robowalk/robowalk08.png', 
    '/media/img/gamedev/robowalk/robowalk09.png', 
    '/media/img/gamedev/robowalk/robowalk10.png', 
    '/media/img/gamedev/robowalk/robowalk11.png',
    '/media/img/gamedev/robowalk/robowalk12.png', 
    '/media/img/gamedev/robowalk/robowalk13.png', 
    '/media/img/gamedev/robowalk/robowalk14.png', 
    '/media/img/gamedev/robowalk/robowalk15.png',
    '/media/img/gamedev/robowalk/robowalk16.png',
    '/media/img/gamedev/robowalk/robowalk17.png', 
    '/media/img/gamedev/robowalk/robowalk18.png' 
];

var frames = [];  
var onImageLoad = function() { 
    console.log("IMAGE!!!"); 
};
var setup = function() { 
    j=0; 
    body = document.getElementById('body'); 
    canvas = document.createElement('canvas');  
    ctx = canvas.getContext('2d');  
    canvas.width = 100; 
    canvas.height = 100;  
    body.appendChild(canvas); 
    for (i = 0; i <= assets.length - 1; ++i) {     
       frames[i].src = assets[i]; 
    } 
    setInterval(animate,30);
}

var animate = function() { 
    ctx.clearRect(0,0,canvas.width,canvas.height); 
    if (j >= assets.length) { 
      j=0; 
    } 
    var image = new Image(); 
    image.src = frames[j]; 
    ctx.drawImage(image,0,0);
    ++j;  
}    
var canvas=null;
var-ctx=null;
var资产=[
“/media/img/gamedev/robowalk/robowalk00.png”,
“/media/img/gamedev/robowalk/robowalk01.png”,
“/media/img/gamedev/robowalk/robowalk02.png”,
“/media/img/gamedev/robowalk/robowalk03.png”,
“/media/img/gamedev/robowalk/robowalk04.png”,
“/media/img/gamedev/robowalk/robowalk05.png”,
“/media/img/gamedev/robowalk/robowalk06.png”,
“/media/img/gamedev/robowalk/robowalk07.png”,
“/media/img/gamedev/robowalk/robowalk08.png”,
“/media/img/gamedev/robowalk/robowalk09.png”,
“/media/img/gamedev/robowalk/robowalk10.png”,
“/media/img/gamedev/robowalk/robowalk 11.png”,
“/media/img/gamedev/robowalk/robowalk12.png”,
“/media/img/gamedev/robowalk/robowalk13.png”,
“/media/img/gamedev/robowalk/robowalk14.png”,
“/media/img/gamedev/robowalk/robowalk15.png”,
“/media/img/gamedev/robowalk/robowalk16.png”,
“/media/img/gamedev/robowalk/robowalk17.png”,
“/media/img/gamedev/robowalk/robowalk18.png”
];
var框架=[];
var onImageLoad=function(){
log(“IMAGE!!!”);
};
var setup=function(){
j=0;
body=document.getElementById('body');
canvas=document.createElement('canvas');
ctx=canvas.getContext('2d');
画布宽度=100;
画布高度=100;
body.appendChild(画布);
对于(i=0;i=assets.length){
j=0;
} 
var image=新图像();
image.src=帧[j];
ctx.drawImage(图像,0,0);
++j;
}    

第一个原因是减少延迟。仅将URL放入数组意味着在动画开始之前没有预取图像。第一轮的动画将是缓慢而急促的,因为每个图像都是从网络中检索的。如果动画重复,下一轮将更快。这种考虑主要适用于替换页面(DOM中)上图像元素的动画,而不是通过写入画布

第二个原因是消除开销并提高动画循环的效率。在循环中使用
new Image()
意味着每个帧的绘制时间包括创建新图像对象以及在画布上绘制所需的时间。此外,图像内容只能在提取后写入画布,因此有必要从附加到图像对象的
onload
处理程序写入画布。发布的代码没有做到这一点,并且可能会在某些浏览器尝试同步将没有数据的图像写入画布时引发错误。即使在其他方面成功,重复的动画也会在每次显示一帧时创建一个新的图像对象,并且会影响内存的使用

请注意,原始版本可能使用了
onImageLoad
来检查图像何时已从web完全加载,然后再将对象推入预加载的图像对象数组中。这是预取动画图像的首选方法


在使用之前不要忘记定义
j
:-)

请编辑您的问题并使用格式化工具!请解释一下你想做什么,你得到了什么结果。没有意义。试着解释一下你的问题是草率的、令人困惑的、难以理解的,人们很快就否决了。就要关门了。我可能通过编辑你的代码保存了它。下次发布时,请单击编辑器窗口中的(?),学习如何使用标记语言将代码整齐地格式化为块。不要把你的整个问题都写在标题里,把标题做成一个摘要,然后在文本区写一个清晰的问题。如果你不努力尊重论坛的运作方式,让你的问题清晰易懂,你就不会成功地得到好的答案。好的,谢谢你,我会认真考虑你的建议。这段代码正确吗?我的意图是写一本动画书PhantomJS 2.1.1(Linux 0.0.0)帧每个帧都应该有一个'src'属性'/\/media\/img\/gamedev\/robowalk/'FAILED预期未定义以匹配/\/media\/img\/gamedev\/robowalk/PhantomJS 2.1.1(Linux 0.0.0)ctx.drawImage调用的animate第一个参数应该是我们的一个帧失败预期drawImage已被使用参数Udacity Rocks drawImage(,0,0)drawImage(,0,0)调用我更新了答案,说在设置图像的
src
属性后立即同步绘制图像将导致问题。除了回答张贴的问题之外,我没有什么要补充的-我不明白为什么你可能会在无头浏览器中创建动画,并且不能进一步帮助。