2010-04-06 47 views
2

我有这样的事情:问题的Javascript对象和访问属性,它存在

var test = {}; 

function blah() { 
    test[2] = 'filled'; 
} 

blah(); // ! Hopefully confusion is now averted.. 

console.log(test); 
//result test -> 2:"filled" 

console.log(test[2]); 
//result undefined 

根据一审时,我不明白为什么我越来越二审“未定义”时,该对象的属性显然存在!

有没有人有任何想法?

感谢

OK,似乎民间越来越困惑,什么情况下该代码存在,为了清楚起见,我现在已经添加了调用胡说()。但请参阅Jeff B的回复下的评论!

下面是相关的代码示例这样说:

mydb = ..... //gets created here with relevant credentials 
var test = {}; 
mydb.transaction(
    function(transaction) { 
    transaction.executeSql("select * from mytable;", [], function(transaction,result) { 
    var r = result.rows.item(0); 
    test[2] = r.title; 
}, errorHandler); 
    }); 

    console.log(test); 
    //result test -> 2:"the title" 

    console.log(test[2]); 
    //result undefined 

@Dancrumb 你的JavaScript的单threadedness提给了我一个想法,我想这:

window.setTimeout(function(){ alert(test[2]); },2000); 

,它的工作!我得到了预期值以提醒。你能否建议我如何在不使用上述“黑客”的情况下解决这个问题?

+1

你没有显示你的所有代码,或者你正在关注第一个'console.log'的结果。 – 2010-04-06 17:54:29

+0

我不明白你为什么在第一个地方得到'2:filled'(没有运行'blah()')。 – 2010-04-06 17:55:03

+0

没有。我只是在Firebug控制台中运行它,并在控制台后面发表评论。日志(测试)'不是真的 – Dancrumb 2010-04-06 17:57:07

回答

2

因为您不拨打blah()

而且,你想要的:

var test = []; 

或:

var test = new Array(); 
+0

其实blah()确实被调用。我应该提到这与HTML 5客户端数据库有关,并且blah()表示的函数会自动调用!所以让我们假设为了清楚起见'blah()'被调用。如果是这样,什么会导致意外的反应? – newbie 2010-04-06 17:55:13

+0

要测试的任务很好。虽然使用一个对象看起来并不正常,但OP在处理数字成员名称的对象方面没有任何内在的不正确。 – Dancrumb 2010-04-06 17:58:16

+0

嗯,当我测试它添加'blah()',使用'alert()'而不是'log()'时,我分别获得了'[object Object]'和'filled'。 – 2010-04-06 17:58:25

2

编辑

我跑到下面的代码:

mydb = openDatabase('note','','Example',1024); 
var test = {}; 
mydb.transaction(
    function(transaction) { 
    transaction.executeSql("select * from mytable;", [], function(transaction,result) { 
    var r = result.rows.item(0); 
    test[2] = r.title; 
}, errorHandler); 
    }); 

    console.log(test); 

    console.log(test[2]); 

在Safari 4.0.5

我有以下几点:

Object 
    No Properties 

undefined 

这是我希望看到的。对象test没有分配给它的任何属性,直到从mydb.transaction发生回调,并且由于Javascript是单线程的,因此在调用console.log之前不会发生这种情况。

既然你得到了不同的结果,你能概述什么浏览器和你使用的是什么版本?

+0

完成,请参阅上文!谢谢 – newbie 2010-04-06 18:09:55

+0

+1,看起来像一个异步的问题乍一看... – 2010-04-06 18:13:05

+0

嗨,我使用谷歌浏览器,版本:4.1.249.1045(42898) – newbie 2010-04-06 19:51:20

0

这很明显是一个异步问题。在设置test [2]之后让代码运行的最简单方法是将代码放在那里,或者使用另一个回调,并在设置test后调用它[2]。

+0

@Russell Leggett:我把你的第一个解决方案,我可能应该有刚开始就完成了!我在代码中的其他地方使用了完全相同的构造,并且它没有任何问题地工作正常,猜测代码必须在有问题的部分做更多的处理,因此是异步问题! – newbie 2010-04-06 20:23:56

+0

非常感谢所有在这个问题上回复的人,非常感谢! @Dancrumb:我仍然有兴趣了解您是否有除Russell Leggett提供的其他创意。 – newbie 2010-04-06 20:25:29