Ну, у вас здесь две проблемы. Проблема first не в понимании того, как this
работает в Javascript. Когда Foo.onData
вызывается через setTimeout( oCallback, ...)
, this
будет ссылаться на глобальный объект, а не Foo
.
Чтобы назвать его с Foo
как this
, вы должны изменить свой код:
sendCommand: function (sCommand, aParams, oCallback) {
var that = this; // save this reference
setTimeout(function () {
oCallback.call( that, // call the function with it
'{"response":"INIT","time":1287982024,"pubid":"4cc50bc47c7b3"}' );
}, 1000);
return true;
},
Чтобы проверить, что изменилось, поместите этот код в onData
:
// is `this` really Foo or the global object?
alert(this === Foo); // should be true
alert(this === window); // should be false
В обновленной версии this
будет правильно ссылаться на Foo
как объект вызова.
Проблема second , с которой вы можете столкнуться, заключается в том, что ваша функция, вызванная с setTimeout
, будет выполняться только после 1000 ms = 1s
, поэтому, если вы просто проверяете alert(Foo.PubId)
вне Foo
вы получите пустую строку (потому что обратный вызов еще не был вызван).
Чтобы проверить, действительно ли Foo.PubId
изменено:
// execute the check after 2s so as to
// make sure the callback has been called
setTimeout( function () {
alert(Foo.PubId);
}, 2000);
Вы можете проверить полный тестовый пример здесь .