Image.onload()的JavaScript循环/作用域问题

Image.onload()的JavaScript循环/作用域问题,javascript,image,loops,scope,Javascript,Image,Loops,Scope,我试图用JavaScript循环遍历一个对象,并将该对象中的所有子对象添加到HTML5画布中 画布位工作正常,没有问题,但出于某种原因,我所有的图像最终都是相同的大小——最后一个子对象“背景”的大小。我假设它与我的循环和“this”的范围有关,但我真的看不出要改变什么 var stage; var items = { head: {image: null, path: "images/avatar-elements/head01.png", w:200, h:200}, hair

我试图用JavaScript循环遍历一个对象,并将该对象中的所有子对象添加到HTML5画布中

画布位工作正常,没有问题,但出于某种原因,我所有的图像最终都是相同的大小——最后一个子对象“背景”的大小。我假设它与我的循环和“this”的范围有关,但我真的看不出要改变什么

var stage;
var items = {
    head: {image: null, path: "images/avatar-elements/head01.png", w:200, h:200},
    hair: {image: null, path: "images/avatar-elements/hair01.png", w:200, h:200},
    nose: {image: null, path: "images/avatar-elements/nose01.png", w:200, h:200},
    eyes: {image: null, path: "images/avatar-elements/eyes01.png", w:200, h:200},
    eyebrows: {image: null, path: "images/avatar-elements/eyebrows01.png", w:200, h:200},
    ears: {image: null, path: "images/avatar-elements/ears01.png", w:200, h:200},
    background: {image: null, path: "images/avatar-elements/background01.png", w:500, h:370}
};

function initCanvas() {
    stage = new Kinetic.Stage("canvas", 500, 370);
    makeBasis();
}


function makeBasis() {
    for(i in items) {
        var img = new Image();
        img.onload = function() {
            items[i].image = makeCanvasImage(this, items[i].w, items[i].h);
        }
        img.src = items[i].path;
    }


}

function makeCanvasImage(tar, w, h) {
    var theImage = new Kinetic.Image({
        imageObj: tar,
        x: 250 - (w / 2),
        y: 185 - (h / 2),
        width: w,
        height: h
    });
    stage.add(theImage);
    return theImage;
}

initCanvas();
错误在makeBasis()中。在所有图像上循环之后,我被设置为最后一个经典的闭包问题。尝试使用以下方法:

函数makeBasis(){
(i)在项目中{
var img=新图像();
img.onload=(函数(nr){
返回函数(){
items[nr].image=makeCanvasImage(此,items[nr].w,items[nr].h);
}
}(i) );
img.src=items[i]。路径;
}
}

Beauty的可能副本,修复了它。你能告诉我“返回函数”是做什么的吗?是否在加载映像后执行?如果图像没有按照加载顺序完成加载,会发生什么情况呢?@Reinoud:
return function(){…}
返回由
function(){…}
定义的函数。这是立即执行的,因为外部函数是立即执行的
(function(){…}())
(注意末尾的括号)。谢谢,为以后阅读添加书签。我将看看我能走多远,在AS3;)中从未遇到过这些问题