Передача аргументов анонимным функциям Javascript

Рассмотрим код ниже:

this.usedIds = 0;

this.SendData = function(data)
{
    var id = this.usedIds;
    this.usedIds++;

    this.xmlHttpThing.open("POST", "/Upload.aspx", true);
    this.xmlHttpThing.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

    var currentObject = this;
    this.xmlHttpThing.onreadystatechange = function() { currentObject.UploadComplete(id) };
    this.xmlHttpThing.send(data);
};
this.UploadComplete = function(id)
{
    if (this.xmlHttpThing.readyState == 4)
    {
        //First time id is 0
        //Second time id is 0                 <<<--------- Why??
        //Third time id is 1
        //Fourth time id is 2
        //Fifth time id is 3 ....         

        this.SendData("blabla");
    }
};

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

Кажется, что так только в Firefox, в IE UploadComplete получают идентификаторы в правильном порядке.

Во втором цикле я могу остановить отладчик в строке отправки (данных) и подтвердить, что идентификатор на самом деле равен 1, но когда я доберусь до UploadComplete, в этом аргументе окажется 0 :(

РЕДАКТИРОВАТЬ: найдено решение:
отключить ведение журнала консоли в FireBug.


person Community    schedule 22.01.2009    source источник
comment
Вероятно, это вызвало рассмотрение приведенного ниже кода. Код должен следовать за объяснением на простом английском языке, а не предшествовать ему. У большинства пользователей здесь есть отвращение к вопросам о стиле исправления моего кода, и этот вопрос поначалу выглядит так.   -  person Tomalak    schedule 23.01.2009


Ответы (2)


У меня тоже была такая же проблема в прошлом. Я не помню точно, что вызвало это, но я исправил это, переместив инкремент в обработчик ответа.

this.UploadComplete = function(id)
{
    if (this.xmlHttpThing.readyState == 4)
    {      
        this.usedIDs++;
        this.SendData("blabla");
    }
};

Редактировать: подумав об этом, мой случай мог отличаться от вашего. Почему бы не увеличить this.usedIDs при назначении id?

var id = this.usedIDs++;
person TJ L    schedule 22.01.2009

Отключение ведения журнала консоли в Firebug решило проблему!

person Community    schedule 22.01.2009
comment
цифры его что-то простое, как это. - person TJ L; 23.01.2009