Проблема с объектом Javascript и доступом к существующему свойству - PullRequest
2 голосов
/ 06 апреля 2010

У меня есть что-то вроде этого:

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

Я не понимаю, почему я получаю 'undefined' во втором случае, когда согласно первому экземпляру свойство этого объекта явно существует!

У кого-нибудь есть идеи?

Спасибо

Хорошо, кажется, что люди путаются в том, в каком контексте существует код, для ясности, я теперь добавил вызов в blah (). но, пожалуйста, обратитесь к комментарию под ответом Джеффа Б!

Вот пример соответствующего кода, так сказать:

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 дало мне идею, и я попробовал это:

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

и это сработало! Я получил ожидаемое значение, чтобы предупредить. Можете ли вы предложить, как я могу обойти это без использования "взломать", как это выше?

Ответы [ 3 ]

2 голосов
/ 06 апреля 2010

EDIT

Я запустил следующий код:

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.

Поскольку вы получаете другой результат, можете ли вы указать, какой браузер и какую версию вы используете?

2 голосов
/ 06 апреля 2010

Потому что вы не звоните blah()?

Также вы хотите:

var test = [];

или

var test = new Array();
0 голосов
/ 07 апреля 2010

Это довольно явно асинхронная проблема. Самый простой способ заставить код работать после установки test [2], это либо поместить код прямо туда, либо использовать другой обратный вызов, и вызвать его после установки test [2].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...