【发布时间】:2012-11-06 23:18:27
【问题描述】:
我试图创建一个对象数组,然后访问数组中的对象属性,但它返回未定义。我调用 createObjArray() 函数,并在我执行 console.log(objArray[1]); 之后立即调用它打印出具有所有属性的对象就好了。但是,如果我尝试执行 console.log(objArray[1].name);萤火虫打印“未定义”。此外,在 firebug 中单步执行我的代码时,我可以将鼠标悬停在 objArray[1].name 上,它会显示正确的名称。这里发生了什么,这让我发疯了。
var objArray = [];
function createObjectArray(numOfObjs) {
for(var i=0; i<numOfObjs; i++) {
packages.push(initObj(i));
}
}
function initObj(i){
var newPackage;
var p = {};
$.getJSON('.../package' + i + '.json', function(data) {
newPackage = new Package(data);
p.name = newPackage.name;
p.id = i;
});
return p;
}
【问题讨论】:
-
$.getJSON 是否进行异步调用?如果是这样,当 initObj 方法返回时 p 将为空。
-
它使用 console.log(arrayObj[1]) 正确打印对象。它在其中打印整个对象,如下所示:Object { name="my name", id=1}。所以 P 回来了
-
这是因为 p 是稍后设置的,从异步调用返回时。您正在 initObj 中创建一个闭包,该闭包捕获对 p 的引用。我从文档中看到 $.getJSON 是异步的。所以这段代码有问题,在异步调用返回之前 p 是一个空对象。
-
我该如何解决这个问题?感谢您的快速回答。
标签: javascript